2013-04-07 3 views
5

ich diese Störung erhalte -Thema/Handler Fehler - Der angegebene Message Queue Synchronisation Sperr Token wurde nicht veröffentlicht

java.lang.IllegalStateException: Die angegebene Nachrichtenwarteschlange Synchronisation Sperre Token geschrieben wurde nicht oder hat wurde bereits entfernt.

Als relativer Neuling in Java/Android, gibt es keinen Zweifel etwas, was ich verpasst haben, aber was ich tue, ist dies -

ich ein Projekt haben, die Exif-Daten verwendet Fotos angezeigt werden gemäß der Datum, dass sie genommen wurden, und die Absicht ist, ein ähnliches Modell auf jeder Stufe zu verwenden ...

Worker-Thread -> UI-Thread -> Benutzerdefinierte Display-Adapter. Durch Klicken auf eine der "Zellen" in GridView wird die nächste Aktivität ausgelöst. Die erste Aktivität sucht nach allen Fotodateien, erstellt eine Liste von "Jahren" und filtert sie anschließend nach Monaten, Tagen usw.

Die zweite Aktivität startet jedoch direkt in den obigen Fehler und die Nachrichten werden über die grundlegende Thread/Handler-Konfiguration behandelt. Hier

ist die Klasse, die Nachrichten an den Thread vorbei -

public class MonthSort { 
Handler handler; 
int imageWidth; 
List<PhotoData> photoList; 
public MonthSort(Handler handler2, int width, List<PhotoData> pList) { 
    photoList = new ArrayList<PhotoData>(); 
    photoList = pList; 
    imageWidth = width; 
    handler = handler2; 
} 

public void sortFiles() 
{ 
    int month, photoCount; 
    File fileName = new File(""); 
    Message msg = handler.obtainMessage(); 
    //Message msg = Message.obtain(); 
    //Bundle bundle = new Bundle(); 
    try { 
     for (int i = 0; i < 12; i++) { 
      month = i + 1; 
      photoCount = 0; 
      for (PhotoData pd : photoList) { 
       if(month == pd.month) 
       { 
        if(photoCount == 0) 
         fileName = pd.fileName; 
        photoCount++; 
       } 
      } 
      if(photoCount != 0) 
      { 

       Bundle bundle = new Bundle(); 
       bundle.putString("filename", fileName.toString()); 
       bundle.putInt("month", month); 
       bundle.putInt("count", photoCount); 
       byte[] thumbNail = getThumbnail(fileName, imageWidth); 
       bundle.putByteArray("thumbnail", thumbNail); 


       msg.setData(bundle); 
       handler.sendMessage(msg); 

      } 
     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     Log.d("Debug", "handler error occurs in monthSort class"); 
    } 
    /*Bundle bundle = new Bundle(); 
    bundle.putBoolean("end", true); 
    msg.setData(bundle); 
    handler.sendMessage(msg);*/ 
} 

... und das ist der Code, den es in dem UI-Thread empfängt.

Bitte beachten Sie, dass ich nicht den gesamten Code enthalten habe, nur die Teile, die ich für relevant halte.

Die vorherige Aktivität verwaltet erfolgreich Nachrichten auf die gleiche Weise, warum nicht die zweite Aktivität?

Ich verstehe, dass der Haupt-UI-Thread bereits einen Looper eingerichtet hat und Sie daher keinen erstellen müssen. Gilt das noch für alle nachfolgenden Aktivitäten, die gestartet werden?

Antwort

7

Das Problem wurde gelöst, indem die Methode dispatchMessage des Handlers anstelle von sendMessage verwendet wurde.

6

Ich habe das gleiche Problem wie hier. Nach zwei Tagen Kampf habe ich einen Weg gefunden, es zu lösen. Es ist einfach. Fügen Sie this.obtainMessage() in Ihrer handlerMessage() hinzu, bevor Sie eine Benutzeroberfläche aktualisieren. Danach wird alles in Ordnung sein.

Ich vermute es lag daran, dass wir zwischen UI-Thread und Hintergrund-Thread zu schnell kommunizieren, in welcher Situation das Android-System Msg nicht richtig selbständig versenden kann. Wenn wir Android dazu zwingen, wird das Problem gelöst. Ich bin mir nicht sicher, es ist nur eine Vermutung. Ich hoffe es kann dir helfen.

Verwandte Themen