Подтвердить что ты не робот

Объект не заблокирован нитью перед уведомлением() в onPostExecute

Я пытаюсь уведомить адаптеры списков основного класса в onPostExecute, но получаю ошибку: java.lang.IllegalMonitorStateException: объект не заблокирован нитью перед уведомлением()

@Override
protected void onPostExecute(String result) {
    popularfragment.adapter.notifyDataSetChanged();
    recentfragment.adapter.notifyDataSetChanged();
} 
4b9b3361

Ответ 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 ;-)
}