2014-06-12 8 views
29

staram się zawiadomić Adaptery listviews z głównej klasy w onPostExecute ale otrzymuję błąd: java.lang.IllegalMonitorStateException: obiekt nie zablokowany przez wątku przed notify()Przedmiot nie zablokowany przez wątku przed notify() w onPostExecute

@Override 
protected void onPostExecute(String result) { 
    popularfragment.adapter.notifyDataSetChanged(); 
    recentfragment.adapter.notifyDataSetChanged(); 
} 
+1

jesteś pewien wyjątek ten jest spowodowany tym kodem? –

Odpowiedz

58

Metodę .notify() należy wywołać z poziomu kontekstu synchronized, tj. Z wnętrza bloku synchronized.

Podczas wywoływania .notify() jest wywoływany obiekt, który nie jest używany jako blok synchronizowanego bloku, w którym wywoływane jest powiadomienie. Na przykład następujące prace;

synchronized(obj){ 
    obj.notify(); 
} 

Ale to rzuci wyjątek;

synchronized(obj){ 
    // notify() is being called here when the thread and 
    // synchronized block does not own the lock on the object. 
    anotherObj.notify();   
} 

Odniesienie;

0

Miałem ten sam błąd, ale (dla mnie) odpowiedź sugerowane przez Rudi Kershaw nie był problem ... Zadzwoniłem do notify() powiadomienia o niewłaściwy sposób (patrz ostatni wiersz obu fragmentów ):

Nie działa:

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 
} 

robocza:

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

hej użyłem twojego kodu, ale nie wiem gdzie Const został zadeklarowany plz powiedz mi –

+0

Const zawiera stałe wartości w moim projekcie. Naciśnij Ctrl + P (ustaw kursor na "notifiy" i naciśnij skrót), aby zobaczyć informacje o parametrze -> jego Integer (coś w rodzaju identyfikatora, który musisz przekazać powiadomienie). Możesz również dodać nową klasę o nazwie "Const", po prostu naciśnij Alt + Enter, gdy kursor jest ustawiony na Const i wybierz "nową klasę". ;) Rozumiem? * UWAGA: * jeśli masz wiele powiadomień, muszą one mieć różne identyfikatory. Aby usunąć powiadomienie, użyjesz również tego identyfikatora. –

Powiązane problemy