web-dev-qa-db-ja.com

onPostExecuteのnotify()の前にスレッドによってロックされていないオブジェクト

OnPostExecuteでメインクラスのリストビューをアダプターに通知しようとしましたが、次のエラーが表示されます。

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

.notify()メソッドは、synchronizedコンテキスト内から、つまりsynchronizedブロック内から呼び出す必要があります。

_Java.lang.IllegalMonitorStateException_ は、notifyを呼び出す同期ブロックのロックとして使用されていないオブジェクトで.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();        
}
_

参照;

81
Rudi Kershaw

私は同じエラーを抱えていましたが、(私にとって)Rudi Kershawによって提案された答えは問題ではありませんでした...通知のnotify()を間違った方法で呼び出しました(両方のスニペットの最後の行):

動作していません:

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