2012-01-11 60 views
0

雖然我正在更新我的數據庫,但我想要顯示一個進度對話框。我的問題是ProgressDialog遲遲不出現,4-5秒後出現並消失得非常快,它在屏幕上停留幾毫秒,幾乎看不到它,然後立即在列表中顯示新數據。這使我認爲ProgressDialog正在等待數據庫被更新(它不需要太多時間,大約4,5秒),然後它顯示在屏幕上,但速度非常快。我希望ProgressDialog立即出現,我按下'更新'按鈕並保持4-5秒的屏幕。ProgressDialog出現得太晚,消散得太快

class MyAsyncTask extends AsyncTask<Void, Void, Void>{ 

     ProgressDialog myprogsdial; 
     @Override 
     protected void onPreExecute(){ 
      myprogsdial = ProgressDialog.show(MyActivity.this, null, "Upgrade", true); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 

       runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         // TODO Auto-generated method stub 

         RefreshDataBase(); 

        } 
       }); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result){ 
      myprogsdial.dismiss(); 
     } 

    } 

當我打電話吧,new MyAsyncTask().execute();

+0

好像你不知道你在做什麼...爲什麼你在'doInBackground'中使用'runOnUiThread'? ...現在你的代碼流是這樣的:我開始新的線程(AsyncTask)在UI線程上運行作業(runOnUiThread) – Selvin 2012-01-11 17:06:50

+0

在調用新的MyAsyncTask之前執行ProgressDialog.show(...)調用時會發生什麼).execute(),並在原始代碼中保持最後的引用(對進度對話框)? – bgs 2012-01-11 17:10:11

回答

1

我已經解決了,使用this answer of Vladimir Ivanov。 我已將外觀的功能分開。 我已將功能(下載新數據)保留在doInBackground()onPostExecute()我更新了列表:獲取新適配器,名爲setListAdaper()notifyDataSetChanged。 當然,我退出使用runOnUiThread()。感謝所有提示。

5

好吧,我認爲這

runOnUiThread(新的Runnable(){

是導致此行爲。

doInBackground()以新的方式執行你的代碼廣告到主UI線程。然後,您將代碼在此線程中執行回到主線程中,導致進度對話框在最後延遲,然後在postExecute()中立即關閉。

一個很好的asyntask教程可以在這裏找到。

2

您不能使用runOnUiThread。什麼你基本上做是:

  1. 開始新的非UI線程
  2. 從這個新的非UI線程你貼一個長期運行的任務UI線程。
  3. 退出非UI線程。
  4. 您的UI線程現在執行長時間運行(RefreshDataBase)並阻止用戶界面。

您應該直接致電RefreshDataBase()。如果此方法涉及UI,則必須重構它。

+0

我試圖直接調用'RefreshDataBase',但是它崩潰了:'由於:java.lang.RuntimeException:無法在沒有調用Looper.prepare()'的線程中創建處理程序。你是什​​麼意思,我不得不重構它? – AlexAndro 2012-01-11 17:22:17

+0

這是因爲它使用了應該在UI線程上運行的東西(或者至少在Looper線程上運行)。 – inazaruk 2012-01-11 18:50:31