Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Object not locked by thread before notify() in onPostExecute

I try to notify adapters of listviews of main class in onPostExecute but I receive the error: java.lang.IllegalMonitorStateException:object not locked by thread before notify()

@Override protected void onPostExecute(String result) {     popularfragment.adapter.notifyDataSetChanged();     recentfragment.adapter.notifyDataSetChanged(); }  
like image 938
Erkan Erol Avatar asked Jun 12 '14 13:06

Erkan Erol


2 Answers

The .notify() method has to be called from within a synchronized context, ie from inside a synchronized block.

The java.lang.IllegalMonitorStateException is thrown when you call .notify() on an object that is not used as the lock for the synchronized block in which you call notify. For example, the following works;

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

But this will throw the exception;

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

Reference;

  • IllegalMonitorStateException API
  • How to use wait & notify
like image 197
Rudi Kershaw Avatar answered Sep 18 '22 12:09

Rudi Kershaw


I had the same error, but (for me) the answer suggested by Rudi Kershaw wasn't the issue... I called the notify() of a Notification the wrong way (see the last line of both snippets):

Not working:

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 } 

Working:

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 ;-) } 
like image 30
Martin Pfeffer Avatar answered Sep 21 '22 12:09

Martin Pfeffer