2012-03-08 78 views
4

我已经习惯了following成语上的AsyncTask的doInBackground方法快速插入到DB重工DB操作:安卓:与进度对话框

mDatabase.beginTransaction(); 
    try { 
      //... do DB stuff 

      mDatabase.setTransactionSuccessful(); 
    } finally { 
      mDatabase.endTransaction(); 
    } 

但是,如果我用这个成语,我的进度对话框(放置在onPreExecute方法中)不显示。另一方面,如果我用常规的mDatabase.execSQL()语句替换上述代码,进度对话框会显示,但插入变得非常慢。有什么办法可以让我有两全其美(即进度对话和快速插入)。谢谢!

注意:beginTransaction在EXCLUSIVE模式下运行(我不明白tbh是什么意思)。这是原因吗?

+1

您的进度对话框显示在PreExecute()中并隐藏在PostExecute()中吗? – 2012-03-08 19:21:25

+0

是的。它工作正常,如果我使用SQLiteDatabase.execSQL插入,而不是上述成语。然而,这些是痛苦的缓慢,所以我几乎坚持使用上面的成语... – OckhamsRazor 2012-03-08 19:22:45

+0

你有没有尝试保持AsyncTask之外的ProgressDialog的引用来显示/隐藏它自己?这就是我会尝试的。 – 2012-03-08 19:29:45

回答

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,然后在对话框被显示。我仍然不明白为什么会发生这种情况,但现在是这样。感谢你的帮助。

0

在开始AsyncTask之前显示对话框(例如,通过showDialog())。

+0

谢谢。但是这也不起作用。进度对话框仅在所有插入发生后才显示。你认为这是因为beginTransaction成语吗?如果我使用常规的sql语句插入,一切正常。 – OckhamsRazor 2012-03-09 05:02:39

+0

如果你把这个放在你的onCreate中,它可能会在* onCreate被beginTransaction()调用完成之前锁定*。 – 2013-04-07 20:20:31

0

我遇到了同样的问题,我想我可以解释发生了什么(在我的情况)。如果你放入数据库的上下文是你的活动,它也会锁定你的活动来完成你的onCreate(因此,不允许你的progressdialog显示),因此beginTransaction()锁定你的数据库。

对我的程序的简单修复是让线程休眠几百毫秒,然后在progressdialog初始化后通过beginTransaction()锁定数据库/活动。