2017-08-24 3 views
0

Dieses Thema wurde bisher oft diskutiert, aber immer noch nicht gelungen, es funktioniert.Nachricht, die an den UI-Thread gesendet wird nie ankommt

Mein MainActivity hat eine Eigenschaft Handler mHandlerUi; genannt, die in seinem Konstruktor initialisiert

mHandlerUi = new Handler() { 
      @Override 
      public void handleMessage(Message msg){ 
       onMessageArrive(msg); 
      } 
     }; 

später im Code, in einer anderen Klasse, während Bauzeit initialisieren ich eine andere Handler Eigenschaft

mHandlerToUi = new Handler(Looper.getMainLooper());

Während der Laufzeit des Threads wird das folgende Code-Snippet X-mal ausgeführt.

Message msg = mHandlerToUi.obtainMessage(); 
    msg.what = ConstMessages.MSG_NEW_GPS_POINT; 
    msg.setData(bundleContet); 

    mHandlerToUi.sendMessage(msg); 

Leider ist die Nachricht kommt nie an die MainActivity Loopers, beide Threads die gleiche Benutzeroberfläche des Greifers verwendet,

Was bin ich hier fehlt vorbei?

Antwort

1

Wenn ich Sie richtig verstehe, haben Sie zwei Handler initiiert und möchten die Nachricht von einem zum anderen weitergeben?

Vielleicht sollten Sie stattdessen den Handler an die zweite Klasse übergeben. Also in Ihrem MainActivity Sie haben

mHandler = new Handler(Looper.getMainLooper()) { 
     @Override 
     public void handleMessage(Message inputMessage) { 
      onMessageArrive(msg); 
     } 
    } 

und geben diese mHandler auf Ihre zweite Klasse über Konstruktor oder Setter-Methode.

+0

genau das, was ich versuche zu tun, aber wie komme ich Verweis des Handler teilen muß unter den Klassen, und nicht sein Looper? Gibt es eine Möglichkeit, denselben Effekt zu erzielen, wenn ich DuplicateHandle (c language) verwenden würde –

+0

Kevinrob hat Ihre Frage beantwortet, was hält Sie davon ab, die Handler-Referenz zu übergeben? – qichuan

1

Jede Handler behandeln ihre Nachrichten. Die Looper wird zum Ausführen eines Handler auf einem bestimmten Thread verwendet.

Wenn Sie zwei Handler erstellen, wird nicht kommuniziert. Es wird nur die gleichen Looper teilen, die auf einem Thread laufen.

können Sie gute Antworten auf What is the relationship between Looper, Handler and MessageQueue in Android? finden

+0

Also Looper ist nur die Warteschlangenverwaltung unter anderen Instanzen, aber die Kommunikation selbst wird vom Handler erledigt? –

+1

@igalk lesen [this] (https://blog.mindorks.com/android-core-looper-handler-and-handlerthread-bd54d69fe91a) – pskink

Verwandte Themen