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()锁定数据库/活动。