作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序线程可以继续之前,我实际上需要等待 ui 线程执行一个 runnable。 wait()/notify() 方法是正确的方法还是有更好的方法?我实际做的是这样的:
public void showVideoView() {
try {
final AtomicBoolean done = new AtomicBoolean(false);
final Runnable task = new Runnable() {
@Override
public void run() {
synchronized(this) {
mStartupCurtain.setVisibility(View.GONE);
mVideoView.setVisibility(View.VISIBLE);
mWebView.loadUrl("about:blank");
mWebView.setVisibility(View.GONE);
done.set(true);
notify();
}
}
};
mUiHandler.post(task);
synchronized(task) {
while(!done.get()) {
task.wait();
}
Log.d(TAG, "showVideoView done!");
}
} catch (InterruptedException e) {
Log.e(TAG, "Thread got interrupted while waiting for posted runnable to finish its task");
}
}
此外,当我这样做时,我必须确保该线程不是 UI 之一,当我开始从来自 MediaPlayer.OnCompletionListener 等接口(interface)的监听器方法调用方法时会发生这种情况。
你怎么看?
最佳答案
我觉得不错。
“完成”变量可以是常规 boolean 值而不是 AtomicBoolean,因为您明确地在锁中获取/设置它的值。我喜欢您在调用 wait 之前检查“完成”的值——因为很可能在您进入工作线程中的锁之前任务已经完成。如果您没有这样做,wait() 调用将无限期进行,因为 notify() 已经发生。
有一种边缘情况需要考虑,它可能适用于您的设计,也可能不适用于您的设计。如果 UI 线程试图退出(即应用程序退出),而工作线程仍然卡在等待任务完成,会发生什么情况?另一种变体是工作线程正在等待任务完成,但 UI 线程正在等待工作线程退出。后者可以通过另一个 boolean 变量来解决,UI 线程通过该变量向工作线程发出退出信号。这些问题可能相关也可能不相关 - 取决于 UI 如何开始管理线程。
关于java - 将可运行对象发布到 UI 线程后调用 wait() 直到完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20179193/
我是一名优秀的程序员,十分优秀!