2011-09-27 133 views
0

我在runOnUiThread中遇到了Android問題。我開始一個等待一段時間的AsyncTask(在一個Activity內),並且在調用方法showDialog(id)之後。在這次調用之後,它又睡了一會兒,並完成調用方法dismissDialog(id)。如何在繼續執行之前'刷新'UI線程操作

這是代碼:

public class MyActivity extends Activity { 

... 

    protected class StartWaiting extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      try { 
       Thread.sleep(2500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      // Show dialog 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        showDialog(PROGRESS_DIALOG_LOADING); 
       } 
      }); 

      try { 
       Thread.sleep(2500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      // Dismiss dialog 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        dismissDialog(PROGRESS_DIALOG_LOADING); 
       } 
      }); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void arg) { 
      new StartServices().execute(); 
     } 
    } 

} 

不幸的是,該行爲是從我想要做的不同:的ShowDialog()和dismissDialog()被稱爲後立即另一個。

我認爲這種情況發生的原因是UI線程執行兩個動作「什麼時候可以」,即在睡眠動作結束時。

那麼,它是否存在一些「flushUI()」方法強制一個線程(在這種情況下,UI線程)在繼續之前執行每個動作?

+0

你怎麼運行的AsyncTask? –

+0

new StartWaiting()。execute(); –

回答

1

你可以只添加一個同步點在你的線程,使用的CountDownLatch例如:

 final CountDownLatch latch = new CountDownLatch(1); 

     view.post(new Runnable() { 
      public void run() { 
       try { 
        // Do stuff on the UI thread 
       } finally { 
        latch.countDown(); 
       } 
      } 
     }); 

     try { 
      if (!latch.await(CAPTURE_TIMEOUT, TimeUnit.MILLISECONDS)) { 
       return; 
      } 
     } catch (InterruptedException e) { 
      // Handle exception 
     } 
+0

非常感謝,它完美的作品! –

相關問題