我想知道一個監聽器應該如何讓父線程知道它已被調用。 (基本上我試圖強制異步調用是同步的。)我的例子包括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語句爲簡單起見,儘管它在真正的代碼)。通常情況下,我想也有兩個線程之間通信時的標誌,但我不能爲此使用局部變量,因爲它必須是最終可以從匿名類訪問的,並且實例變量看起來像是抽象違例(並且必須是易失性的)。
上述代碼是否安全和/或是否有更好的方法來解決問題?
您是打算允許多個線程同時運行myMethod()或只運行一個線程? – Java42 2012-03-20 22:07:27
@ChuckFricano,只有一個線程。 – 2012-03-20 22:44:48