zoukankan      html  css  js  c++  java
  • Object not locked by thread before notify() in onPostExecute

    Asked 5 years, 4 months ago
    Viewed 56k time
    41

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

    2 Answers

    81
     

    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;

     
     
    2

    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 ;-)
    }
    
     
     
     
     
    https://stackoverflow.com/questions/24185921/object-not-locked-by-thread-before-notify-in-onpostexecute
  • 相关阅读:
    MicroStation VBA 操作提示
    MicroStation VBA 可视化界面
    VBA 操作数字
    MicroStation VBA基础
    C#问题
    C#复习⑨(附带C#参考答案仅限参考)
    C#复习⑧
    C#复习⑦
    C#复习⑥
    C#复习⑤
  • 原文地址:https://www.cnblogs.com/pengmn/p/11658507.html
Copyright © 2011-2022 走看看