Java 在 onPostExecute 中的 notify() 之前线程未锁定对象
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24185921/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Object not locked by thread before notify() in onPostExecute
提问by Erkan Erol
I try to notify adapters of listviews of main class in onPostExecute but I receive the error: java.lang.IllegalMonitorStateException:object not locked by thread before notify()
我尝试在 onPostExecute 中通知适配器主类的列表视图,但收到错误:java.lang.IllegalMonitorStateException:notify() 之前线程未锁定对象
@Override
protected void onPostExecute(String result) {
popularfragment.adapter.notifyDataSetChanged();
recentfragment.adapter.notifyDataSetChanged();
}
采纳答案by Rudi Kershaw
The .notify()
method has to be called from within a synchronized
context, ie from inside a synchronized
block.
该.notify()
方法必须从synchronized
上下文中调用,即从synchronized
块内部调用。
The java.lang.IllegalMonitorStateException
is thrown when you call .notify()
on an object that is not used as the lock for the synchronized block in which you call notify. For example, the following works;
java.lang.IllegalMonitorStateException
当您调用.notify()
未用作您调用通知的同步块的锁的对象时,将抛出。例如,以下作品;
synchronized(obj){
obj.notify();
}
But this will throw the exception;
但这会抛出异常;
synchronized(obj){
// notify() is being called here when the thread and
// synchronized block does not own the lock on the object.
anotherObj.notify();
}
Reference;
参考;
回答by Martin Pfeffer
I had the same error, but (for me) the answer suggested by Rudi Kershaw wasn't the issue... I called the notify()
of a Notification the wrong way (see the last lineof both snippets):
我有同样的错误,但(对我而言)鲁迪·克肖建议的答案不是问题......我notify()
以错误的方式调用了通知(参见两个片段的最后一行):
Not working:
不工作:
public void update() {
mBuilder.setSmallIcon(R.drawable.ic_launcher)
.setPriority(AesPrefs.getInt(R.string.PRIORITY_NOTIFICATION_BATTERY, NotificationCompat.PRIORITY_MAX))
.setOngoing(true);
mBuilder.setWhen(AesPrefs.getLong(Loader.gStr(R.string.LAST_FIRED_BATTERY_NOTIFICATION) + Const.START_CLIPBOARD_NOTIFICATION_DELAYED, -1));
mManager.notify(); // <- lil' mistake
}
Working:
在职的:
public void update() {
mBuilder.setSmallIcon(R.drawable.ic_launcher)
.setPriority(AesPrefs.getInt(R.string.PRIORITY_NOTIFICATION_BATTERY, NotificationCompat.PRIORITY_MAX))
.setOngoing(true);
mBuilder.setWhen(AesPrefs.getLong(Loader.gStr(R.string.LAST_FIRED_BATTERY_NOTIFICATION) + Const.START_CLIPBOARD_NOTIFICATION_DELAYED, -1));
mManager.notify(Const.NOTIFICATION_CLIPBOARD, mBuilder.build()); // <- ok ;-)
}