49

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(); } 
1
  • 2
    are you sure this exception is caused by this code? Commented Jun 12, 2014 at 13:40

2 Answers 2

100

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;

Sign up to request clarification or add additional context in comments.

Comments

3

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

2 Comments

hey i used your code but i don't know where Const has been declared plz tell me
Const contains constant values in my project. Press Ctrl+P (set the cursor on "notifiy" and press the shortcut) to see the parameter info -> its an Integer (something like an ID you have to give the notification). You can also add a new Class called "Const", simply press Alt+Enter when the cursor is on Const and select create "new class". ;) Got it? NOTE: if you have multiple notifications, they need to have different IDs. To clear the notification you will use this ID as well.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.