我有一个MyService
类,它包含一个嵌套的BroadcastReceiver
类:
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()
时,我的代码在synchronized
块中运行doTask()
。然后,在doTask()
函数中,我的代码运行lock.notify()
。我希望看到登录终端Log.d(TAG, "After wait ...");
我运行我的Android项目。当onReceive()被触发时,我可以看到日志"do task…",然后,它挂在那里,我看不到日志"After wait…',为什么我的等待通知没有按预期工作?
我运行我的Android项目。当onReceive()被触发时,我可以看到日志"做任务…",然后,它挂在那里,我看不到日志"之后等待",为什么我的等待通知没有按预期工作?
BroadcastReceiver
总是在ui线程上运行。如果MyService
在Ui线程上运行,则会出现死锁。也可能是MyService
在后台线程上运行。如果在等待之前执行通知,则运行MyService的线程正在等待下一个通知