2012-01-04 18 views
2

一定の時間が経過するとUIを更新する必要があります。そのためには、タイマースケジュールを作成し、その中にrunOnUiThreadを呼び出します。runOnUiThreadが完了するまで待機するタイマータスクを作成する方法

timer.scheduleAtFixedRate(new TimerTask() { 

      public void run() { 
       System.out.println("1"); 
        try { 

        System.out.println("2"); 
        System.out.println("3"); 

        runOnUiThread(new Runnable() { 

         public void run() { 
          System.out.println("4"); 
          System.out.println("5"); 
          System.out.println("6"); 
          System.out.println("7"); 
         } 
        }); 

        System.out.println("8"); 
       } catch (Exception e) { 

        e.printStackTrace(); 
       } 

      } 

     }, delay, period); 
     System.out.println("9"); 

私は「3」に達した後、タイマースレッドから「8」ジャンプし、その後UIスレッドが「4」から実行されること。問題が生じています UIスレッドが "7"で作業を完了するまで待機するタイマースレッドを作成し、 "8"に移動する必要があります。

サンプル出力

01-05 00:30:16.308: I/System.out(1394): 1 
01-05 00:30:16.308: I/System.out(1394): 2 
01-05 00:30:16.308: I/System.out(1394): 3 
01-05 00:30:16.308: I/System.out(1394): 8 
01-05 00:30:16.308: I/System.out(1394): 4 
01-05 00:30:16.308: I/System.out(1394): 5 
01-05 00:30:16.308: I/System.out(1394): 6 
01-05 00:30:16.308: I/System.out(1394): 7 
01-05 00:30:17.307: I/System.out(1394): 1 
01-05 00:30:17.307: I/System.out(1394): 2 
01-05 00:30:17.307: I/System.out(1394): 3 
01-05 00:30:17.307: I/System.out(1394): 8 
01-05 00:30:17.307: I/System.out(1394): 4 
01-05 00:30:17.323: I/System.out(1394): 5 
01-05 00:30:17.323: I/System.out(1394): 6 
01-05 00:30:17.323: I/System.out(1394): 7 

答えて

3

は、私はこれを達成する最も簡単な方法は、 "たCountDownLatch" を使用していると思う。この

Object lock=new Object(); 
timer.scheduleAtFixedRate(new TimerTask() { 

     public void run() { 
      System.out.println("1"); 
       try { 

       System.out.println("2"); 
       System.out.println("3"); 

       runOnUiThread(new Runnable() { 

        public void run() { 
         System.out.println("4"); 
         System.out.println("5"); 
         System.out.println("6"); 
         System.out.println("7"); 
         synchronized(lock){lock.notify();} 
        } 
       }); 
       try{ 
        synchronized(lock){lock.wait();} 
       }catch(InterruptedException x){} 
       System.out.println("8"); 
      } catch (Exception e) { 

       e.printStackTrace(); 
      } 

     } 

    }, delay, period); 
    System.out.println("9"); 
+0

待機の前に通知が発生する可能性が非常に低い可能性があります。むしろここではカウントダウンを使用したいと思います。 (または、syncブロック内のrunonuithread呼び出しを含めて、待機前に通知が呼び出されていないことを確認する) – njzk2

1

を試してみてください。

final CountDownLatch latch = new CountDownLatch(1); 
runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 

     // Do something on the UI thread 

     latch.countDown(); 
    } 
}); 
try { 
    latch.await(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

// Now do something on the original thread 
関連する問題