データベース接続に問題があります。データベース接続などを作成する 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();
}
}
}