如何在继续执行之前“刷新”UI线程操作

时间:2011-09-27 15:53:10

标签: java android multithreading

我在使用runOnUiThread的Android中遇到了问题。我启动AsyncTask(在Activity中)等待一段时间,并在调用方法showDialog(id)之后。在此调用之后,它会再次休眠,并完成调用方法dismissDialog(id)。

这是代码:

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线程)在继续之前执行每个操作?

1 个答案:

答案 0 :(得分: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
        }