Ask Question
Asked5 years, 4 months ago
Active3 years, 9 months ago
Viewed56k time
41
2
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();
}
java
android
multithreading
share
improve this question
asked
Jun 12 ’14 at 13:38
Erkan Erol
65411 gold badge77 silver badges2323 bronze badges
add a comment
2 Answers
active
oldest
votes
81
The.notify()
method has to be called from within asynchronized
context, ie from inside asynchronized
block.
Thejava.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
share
improve this answer
editedMay 23 ’17 at 11:55
Community
♦
111 silver badge
answered
Jun 12 ’14 at 13:48
Rudi Kershaw
7,72555 gold badges3838 silver badges6969 bronze badges
add a comment
2
I had the same error, but (for me) the answer suggested by Rudi Kershaw wasn’t the issue… I called thenotify()
of a Notification the wrong way (see thelast lineof 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 ;-)
}
share
improve this answer
answered
Dec 29 ’15 at 20:19
Martin Pfeffer
8,59877 gold badges4444 silver badges6060 bronze badges
add a comment
https://stackoverflow.com/questions/24185921/object-not-locked-by-thread-before-notify-in-onpostexecute
Similar Posts:
- Java Thread wait, notify and notifyAll Example
- Concurrent notes (4): Notes on the use of wait / notify / notifyAll method
- [azure environment] notification hub failed to create policy: 500 internal server error occurred
- [Solved] android.app.RemoteServiceException: Bad notification for startForeground
- Solution to unknown media type in type * * / * * when installing DEB package
- [Solved] Java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
- How to Solve error: com.android.ide.common.process.ProcessException: Failed to execute aapt
- Interaction between web browser and JavaScript in WPF
- Convert Object to List>, avoiding Unchecked cast: ‘java.lang.Object’ to ‘java.util.List
- Unity – NullReferenceException: Object reference not set to an instance of an object