我习惯使用following惯用法在AsyncTask的doInBackground
方法上快速插入数据库:
mDatabase.beginTransaction();
try {
//... do DB stuff
mDatabase.setTransactionSuccessful();
} finally {
mDatabase.endTransaction();
}
但是,如果我使用这个习惯用法,则不会显示我的进度对话框(放在onPreExecute
方法中)。另一方面,如果我用常规mDatabase.execSQL()语句替换上面的代码,则会显示进度对话框,但插入变得非常慢。有什么方法可以让两个世界都做到最好(即进度对话和快速插入)。谢谢!
注意:beginTransaction在EXCLUSIVE模式下运行(我不知道这意味着什么)。这是原因吗?
答案 0 :(得分:0)
在开始AsyncTask
之前显示您的对话框(例如,通过showDialog()
)。
答案 1 :(得分:0)
我找到了答案。显然,这是我在doInBackground之前做的事情,这就是问题所在。我定义了以下内容:
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgD = ProgressDialog.show(mContext, "", "Wait", true);
ih = new InsertHelper(mDatabase, "dictionary");
wordColumn = ih.getColumnIndex("word");
}
如果我在beginTransaction惯用法之前将ProgressDialog.show下面的代码移动到doInBackground中,则会显示该对话框。我仍然不明白为什么会发生这种情况,但确实如此。谢谢你的帮助。
答案 2 :(得分:0)
我遇到了同样的问题,我想我可以解释发生了什么(在我的情况下)。
beginTransaction()会锁定您的数据库,因此如果您放入数据库的上下文是您的活动,它还会锁定您的活动以完成onCreate(因此,不允许您显示progressdialog)。
我程序的简单修复是让线程休眠几百毫秒,然后在progressdialog初始化后通过beginTransaction()锁定数据库/活动。