gpt4 book ai didi

java - 如何与已调用监听器的父线程通信?

转载 作者:行者123 更新时间:2023-11-29 06:01:57 25 4
gpt4 key购买 nike

我想知道监听器应该如何让父线程知道它已被调用。 (基本上我试图强制异步调用是同步的。)我的示例包括 Android 调用,但它更像是一个一般的同步问题...

方法 myMethod() 请求 SoundPool 加载声音并在调用完成时通知监听器。我希望 myMethod() 等到监听器被调用后再返回。我想出的代码是:

void myMethod() {
SoundPool soundPool = ...;
final Lock object = new Object();

soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener(){
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
synchronized(lock) {
lock.notify();
}
}});
synchronized(lock) {
int soundId = MediaUtil.loadSoundPool(soundPool, ...); // returns immediately
lock.wait();
}
}

(为简单起见,我省略了 try/catch,尽管它在实际代码中。)通常,在两个线程之间通信时我也会有一个标志,但我不能为此目的使用局部变量,因为它必须是最终的才能从匿名类访问,并且实例变量似乎违反了抽象(并且必须是易变的)。

上面的代码是否安全和/或是否有更好的方法来解决问题?

最佳答案

许多选项可满足您的需求。这是使用等待/通知的一种方法。 isNotified 用于防止在调用 setListener() 的同一线程调用 onLoadComplete() 的情况下挂起。当您查看大型应用程序的线程转储时,类 MonitorXX 在这里可以使调试更容易。根据需要添加错误/异常/超时检查。

static class Monitor42{boolean isNotified=false;} 
static Monitor42 monitor = new Monitor42();
void myMethod() {
synchronized(monitor) {
monitor.isNotified=false;
xxx.setListener(new Listener(){
public void onLoadComplete() {
synchronized(monitor) {
monitor.isNotified=true;
monitor.notify();
}
}});
if (!monitor.isNotified) monitor.wait(someTimeValueMS);
monitor.isNotified=false;
}
}

关于java - 如何与已调用监听器的父线程通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9795537/

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