Android:具有进度对话框的重型DB操作
我曾经习惯在AsyncTask的doInBackground
方法上使用idiom来快速插入到DB中:
mDatabase.beginTransaction(); try { //... do DB stuff mDatabase.setTransactionSuccessful(); } finally { mDatabase.endTransaction(); }
但是,如果我使用这个习惯用法,则不会显示我的进度对话框(放在onPreExecute
方法中)。 另一方面,如果我用常规mDatabase.execSQL()语句替换上面的代码,则会显示进度对话框但插入变得非常慢。 有什么方法可以让两个世界都做到最好(即进度对话和快速插入)。 谢谢!
注意:beginTransaction以EXCLUSIVE模式运行(我不知道这意味着什么)。 这是原因吗?
在启动AsyncTask
之前显示对话框(例如,通过showDialog()
)。
我找到了答案。 显然,这是我在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中,则会显示该对话框。 我仍然不明白为什么会发生这种情况,但确实如此。 感谢你的帮助。
我遇到了同样的问题,我想我可以解释发生了什么(在我的情况下)。
beginTransaction()会锁定您的数据库,因此如果您放入数据库的上下文是您的活动,它还会锁定您的活动以完成onCreate(因此,不允许您显示progressdialog)。
我的程序的简单修复是让线程hibernate几百毫秒,然后在progressdialog初始化后通过beginTransaction()锁定数据库/活动。