Objekt nicht durch Thread gesperrt vor Notify() in onPostExecute

Lesezeit: 2 Minuten

Ich versuche, Adapter von Listenansichten der Hauptklasse in onPostExecute zu benachrichtigen, aber ich erhalte den Fehler: java.lang.IllegalMonitorStateException: Objekt nicht durch Thread gesperrt, bevor es benachrichtigt wird ()

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

  • Sind Sie sicher, dass diese Ausnahme durch diesen Code verursacht wird?

    – Marco Acierno

    12. Juni 2014 um 13:40 Uhr

Benutzer-Avatar
Rudi Kershaw

Das .notify() Die Methode muss innerhalb von a aufgerufen werden synchronized Kontext, dh von innen a synchronized Block.

Das java.lang.IllegalMonitorStateException wird geworfen, wenn Sie anrufen .notify() auf einem Objekt, das nicht als Sperre für den synchronisierten Block verwendet wird, in dem Sie notification aufrufen. Zum Beispiel die folgenden Werke;

synchronized(obj){
    obj.notify();
}

Aber dies wird die Ausnahme auslösen;

synchronized(obj){
    // notify() is being called here when the thread and 
    // synchronized block does not own the lock on the object.
    anotherObj.notify();        
}

Bezug;

Ich hatte den gleichen Fehler, aber (für mich) war die von Rudi Kershaw vorgeschlagene Antwort nicht das Problem … Ich rief die an notify() einer Benachrichtigung falsch herum (siehe die letzte Linie beider Schnipsel):

Funktioniert nicht:

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
}

Arbeiten:

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 ;-)
}

  • Hey, ich habe deinen Code verwendet, aber ich weiß nicht, wo Const deklariert wurde, bitte sag es mir

    – Mahdi Javaheri

    10. Februar 2016 um 12:17 Uhr

  • Const enthält konstante Werte in meinem Projekt. Drücken Sie Strg + P (setzen Sie den Cursor auf “benachrichtigen” und drücken Sie die Tastenkombination), um die Parameterinformationen anzuzeigen -> es ist eine ganze Zahl (so etwas wie eine ID, die Sie der Benachrichtigung geben müssen). Sie können auch eine neue Klasse namens “Const” hinzufügen, drücken Sie einfach Alt+Enter, wenn sich der Cursor auf Const befindet, und wählen Sie “Neue Klasse erstellen”. 😉 Ich habs? HINWEIS: Wenn Sie mehrere Benachrichtigungen haben, müssen diese unterschiedliche IDs haben. Um die Benachrichtigung zu löschen, verwenden Sie diese ID ebenfalls.

    – Martin Pfeffer

    10. Februar 2016 um 12:38 Uhr


1054180cookie-checkObjekt nicht durch Thread gesperrt vor Notify() in onPostExecute

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy