异步任务postexecute中的通知非法监视状态异常

时间:2014-01-02 08:18:50

标签: java android multithreading android-asynctask android-notifications

我正在创建一个应用程序,通知在线存储的数据发生变化时。为此,我使用alarmmanager / broadcastreceiver定期检查广播接收器中使用异步任务的任何更改。如果有任何更改,在帖子执行部分线程中,我正在开始通知。  在“nm.notify();”的行上我使用调试器得到一个InvocationTargetException异常的原因是“IllegalMonitorStateException:对象在notify()之前没有被线程锁定” 有人能否对正在发生的事情有所了解。提前谢谢。

OnPostExecute的代码是:

@Override
protected void onPostExecute(String result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    resultstr=result;
    SharedPreferences sp=context.getSharedPreferences("Prefs", 3);
    String oldresult=sp.getString("notification", "hello world");
    if (resultstr.equals("unable to connect to internet")){}else if(resultstr.equals("")){}else
    if (!oldresult.equals(resultstr)){
        NotificationManager nm = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = new Notification(R.drawable.ic_launcher,"Tax Tracker 2014",System.currentTimeMillis());
         final Intent notificationIntent = new Intent(context,
                 FB.class);
         PendingIntent p = PendingIntent
                 .getActivity(context, 0, notificationIntent, 0);
         notification.setLatestEventInfo(context, "Tax Tracker 2014", "new info alert", p);
         nm.notify();
    SharedPreferences.Editor edit=sp.edit();
    edit.putString("notification", resultstr).commit();
    }
  }

2 个答案:

答案 0 :(得分:2)

Ankit您使用的是错误的方法,您需要notify(id,notification)中定义的NotificationManager方法,但您使用的是Object#notify()

我认为你需要这个NotificationManager#notify(int id, Notification notification)

public void notify (int id, Notification notification)
  

发布要在状态栏中显示的通知。如果是通知   具有相同ID的已经由您的应用程序发布并具有   尚未取消,将被更新的信息取代。

参数

id - An identifier for this notification unique within your application.
notification -  A Notification object describing what to show the user. Must not be null.

异常的原因,但这不是你想做的事情。

在使用nm致电notify()之前,您需要先在synchronized(nm){nm.notify();}上按住锁定。

答案 1 :(得分:0)

您需要先锁定监视器,然后再调用wait()或notify()。

尝试将其放入synchronized(nm)块。