2011-09-27 4 views
0

runOnUiThread를 사용하여 Android에서 문제가 발생했습니다. 잠시 동안 기다리는 AsyncTask (Activity 내부)를 시작한 후 메소드 showDialog (id)를 호출합니다. 이 호출 후, 다른 동안 sleep하고, 메소드 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 스레드가 "수있는 경우", 즉 수면 동작의 끝에서 두 가지 동작을 모두 실행한다고 생각합니다.

음, 스레드 (이 경우 UI 스레드)가 계속하기 전에 모든 동작을 실행하도록하는 "flushUI()"메서드가 있습니까?

+0

어떻게 당신이 AsyncTask를 실행합니까? –

+0

새로운 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

고맙습니다. 완벽하게 작동합니다! –

관련 문제