• 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
  • 相关阅读:
    New-SAN-FENG-YUN-三
    San丰-Cloud
    SpringBoot+MySQL+MyBatis+Shiro+AdminLTE
    SanFeng-Clound
    SanFengClound
    传奇音乐设置
    热血传奇GOM引擎问题集锦
    app测试
    接口测试
    题目
  • 原文地址:https://www.cnblogs.com/pengmn/p/11658507.html
Copyright © 2020-2023  润新知