web-dev-qa-db-fra.com

Objet non verrouillé par le thread avant notify () dans onPostExecute

J'essaie de notifier les adaptateurs des listviews de la classe principale dans onPostExecute mais je reçois le message d'erreur suivant: Java.lang.IllegalMonitorStateException: objet non verrouillé par un thread avant notify ()

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

La méthode .notify() doit être appelée depuis un contexte synchronized, c'est-à-dire depuis un bloc synchronized.

Le Java.lang.IllegalMonitorStateException est lancé lorsque vous appelez .notify() sur un objet qui n'est pas utilisé comme verrou pour le bloc synchronisé dans lequel vous appelez notify. Par exemple, les travaux suivants:

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

Mais cela jettera l'exception;

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

Référence;

81
Rudi Kershaw

J'ai eu la même erreur, mais (pour moi) la réponse suggérée par Rudi Kershaw n'était pas la question ... J'ai appelé la notify() d'une notification de la mauvaise façon (voir la dernière ligne des deux extraits):

ne fonctionne pas:

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
}

travail:

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 ;-)
}
2
Martin Pfeffer