2012-03-08 69 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()鎖定數據庫/活動。