我在使用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线程)在继续之前执行每个操作?
答案 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
}