0

データベース接続に問題があります。データベース接続などを作成する DataManager があります。UI スレッドがデータを取得できるように、この DataManager を作成する Application クラスも作成しました。問題は、データベースへのアクセスも必要とするバックグラウンド スレッドがあることです。これを行う方法が正確にはわかりません (現在、データベースが閉じられていないため、AsyncActivity で新しい DataManager を作成しようとするとエラーが発生します)。 (UIThread が開いているので、これは正しいです)。

だから私は(そしてこれは別のスレッドであるため、これを行う正しい方法ではないかもしれません)、アプリケーションにアクセスし、新しいセッションで同じ DataManager を使用すると考えました。しかし、コンテキストやアクティビティなしで「通常の」クラスからアプリケーションにアクセスするにはどうすればよいですか (考える前にやったことがありますが、思い出せません)。

バックグラウンド タスクのコードは次のとおりです。

public class SyncTask extends AsyncTask<String, Integer, String> {

    private static final String TAG = "Sync";

    /** application context. */
    private Context context;
    private ProgressDialog dialog;

    public SyncTask(Context aContext) {
        //this.activity = activity;
        this.context = aContext;
        dialog = new ProgressDialog(context);
    }

    protected void onPreExecute() {
        this.dialog.setMessage("Loading...");
        this.dialog.setMax(100);
        this.dialog.setProgress(0);
        this.dialog.show();
    }

    @Override
    protected void onPostExecute(final String errMessage) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }

        if (errMessage == null) {
            Toast.makeText(context, "Update completed", Toast.LENGTH_LONG).show();
        } else {
            AlertDialog alertDialog = new AlertDialog.Builder(context).create();
            alertDialog.setTitle("Error...");
            alertDialog.setMessage(errMessage);
            alertDialog.show();
        }
    }

    protected void onProgressUpdate(Integer... progress) {
        Log.d(TAG, "Progress Update: " + progress[0].toString());

        super.onProgressUpdate(progress[0]);
        dialog.setProgress(progress[0]);
    }

    protected String doInBackground(final String... args) {
        try{
            publishProgress( new Float(50).intValue());
            iDomsAndroidApp app = ((iDomsAndroidApp) ?? cannot remember ??);
            DataManager manager = app.getDataManager();
            manager.updateData();

            return null;
        } catch (Exception e){
            Log.e(TAG, "error", e);
            return e.getMessage();
        }
    }

}
4

2 に答える 2

0

所有している任意のContextインスタンスのgetApplicationContext()メソッドを使用して、YouApplicationにreturnをキャストできます。それは絶対に適格です。

于 2012-08-30T15:41:46.670 に答える
0

ContentProviderデータベースへのアクセスにはを使用する必要があります。これはスレッドセーフであり、データを処理するための推奨される方法です。

http://developer.android.com/guide/topics/providers/content-providers.html

于 2012-08-30T10:07:14.453 に答える