2011-09-27 76 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

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

相关问题