我的数据库连接有困难。我有一个创建数据库连接等的DataManager。我还创建了一个Application类,它创建了这个DataManager,因此UI Thread可以获取数据。现在的问题是有一个后台线程也需要访问数据库,我不确定如何做到这一点(目前我在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();
}
}
}
答案 0 :(得分:0)
您应该使用ContentProvider
来访问数据库,它是线程安全的,是处理数据的首选方式。
http://developer.android.com/guide/topics/providers/content-providers.html
答案 1 :(得分:0)
您可以使用您拥有的任何Context实例的getApplicationContext()方法并将其返回到YouApplication。它绝对符合条件。