2

一定期間後に UI を更新する必要があるため、タイマー スケジュールを作成し、その中で 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
4

2 に答える 2

3

これを試して

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");
于 2012-01-04T19:50:25.350 に答える
1

これを実現する最も簡単な方法は、「CountDownLatch」を使用することだと思います。

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
于 2015-08-06T13:59:22.517 に答える