2015-12-06 12 views
-1

我有一個MyService類,它包含一個嵌套BroadcastReceiver類:wait()的通知()不按預期工作

public class MyService { 
    private Object lock; 
    public class MyReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
     synchronized(lock) { 
      doTask(); 
      lock.wait(); 
      Log.d(TAG, "After wait ..."); 
     } 
     } 
    } 
    private synchronized void doTask() { 
     Log.d(TAG, "do task ..."); 
     synchronized(lock) { 
      lock.notify(); 
     } 
    } 
} 

正如你看到的上面,當onReceive()叫,我的代碼運行doTask()在一個​​塊。然後,在doTask()函數中,我的代碼運行lock.notify()。我期望看到登錄終端Log.d(TAG, "After wait ...");

我運行我的Android項目。當onReceive()被觸發,我可以看到日誌「做任務...」,然後,它掛在那裏,我看不到日誌「等待......」,爲什麼我的等待通知沒有按預期工作?

+0

同一個線程正在調用這兩個方法嗎? –

+0

可能是「丟失的通知」。 http://stackoverflow.com/questions/5999100/is-there-a-block-until-condition-becomes-true-function-in-java/26218153#26218153'lock.notify()'_什麼都不做_除非其他線程已經在'lock.wait()'調用中等待。 –

回答

0

我運行我的Android項目。當onReceive()被觸發,我可以看到 日誌「做任務...」,然後,它掛在那裏,我看不到日誌「 等待......」後,爲什麼我的等待通知不是按預期工作?

BroadcastReceiver s始終運行在ui線程上。如果MyService在Ui線程上運行,則遇到的問題是死鎖。這也可能是MyService在後臺線程上運行。如果在等待之前執行notify,那麼運行MyService的線程正在等待下一個通知