Объект не заблокирован нитью перед уведомлением() в onPostExecute
Я пытаюсь уведомить адаптеры списков основного класса в onPostExecute, но получаю ошибку: java.lang.IllegalMonitorStateException: объект не заблокирован нитью перед уведомлением()
@Override
protected void onPostExecute(String result) {
popularfragment.adapter.notifyDataSetChanged();
recentfragment.adapter.notifyDataSetChanged();
}
Ответы
Ответ 1
Метод .notify()
должен вызываться из контекста synchronized
, то есть изнутри блока synchronized
.
java.lang.IllegalMonitorStateException
вызывается при вызове .notify()
объекта, который не используется как блокировка для синхронизированного блока, в котором вы вызываете уведомление. Например, следующие работы:
synchronized(obj){
obj.notify();
}
Но это вызовет исключение;
synchronized(obj){
// notify() is being called here when the thread and
// synchronized block does not own the lock on the object.
anotherObj.notify();
}
Ссылка
Ответ 2
У меня была такая же ошибка, но (для меня) ответ, предложенный Руди Кершоу, не был проблемой... Я назвал notify()
Notification неправильным (см. последнюю строку обоих фрагментов):
Не работает:
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
}
В:
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 ;-)
}