2014-06-12 6 views
29

Ich versuche Adapter von Listviews der Hauptklasse in OnPostExecute zu benachrichtigen, aber ich erhalte die Fehlermeldung: java.lang.IllegalMonitorStateException: Objekt nicht durch Thread gesperrt, bevor notify()Objekt nicht von Thread vor notify() in OnPostExecute gesperrt

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

sind Sie sicher, dass diese Ausnahme von diesem Code verursacht wird? –

Antwort

58

Die Methode .notify() muss innerhalb eines synchronized Kontextes aufgerufen werden, dh von einem synchronized Block.

Die java.lang.IllegalMonitorStateException wird ausgelöst, wenn Sie .notify() für ein Objekt aufrufen, das nicht als Sperre für den synchronisierten Block verwendet wird, in dem Sie notify aufrufen. Zum Beispiel funktioniert das Folgende;

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

Aber das wird die Ausnahme werfen;

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

Bezug;

0

hatte ich den gleichen Fehler, aber (für mich) die Antwort von Rudi Kershaw vorgeschlagen war nicht das Problem ... Ich habe die notify() eine Mitteilung genannt der falscher Weg (siehe letzte Zeile beider Snippets):

Problem:

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 
} 

Arbeits:

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

hey Ich habe Ihren Code verwendet, aber ich weiß nicht, wo Const deklariert wurde plz Erzähl mir –

+0

Const enthält konstante Werte in meinem Projekt. Drücken Sie Strg + P (setzen Sie den Cursor auf "notify" und drücken Sie den Shortcut), um die Parameter-Info zu sehen -> es ist ein Integer (etwas wie eine ID, die Sie die Benachrichtigung geben müssen). Sie können auch eine neue Klasse namens "Const" hinzufügen, drücken Sie einfach Alt + Enter, wenn der Cursor auf Const steht, und wählen Sie create "new class". ;) Ich habs? * HINWEIS: * Wenn Sie mehrere Benachrichtigungen haben, müssen sie unterschiedliche IDs haben. Um die Benachrichtigung zu löschen, verwenden Sie diese ID ebenfalls. –

Verwandte Themen