gpt4 book ai didi

java - 将可运行对象发布到 UI 线程后调用 wait() 直到完成

转载 作者:行者123 更新时间:2023-11-30 09:14:56 26 4
gpt4 key购买 nike

在我的应用程序线程可以继续之前,我实际上需要等待 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com