Was passiert, wenn ein Handler eine Nachricht an einen Thread nach Looper.prepare () platziert, aber bevor Looper.loop () aufgerufen wurde?

Betrachten Sie das folgende Snippet:

Looper.prepare(); handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); getLooper().quitSafely(); } }; for(int i = 0; i < urls.size(); i++) { useCaseProvider.get().execute(callback, handler, urls.get(i), threadPool); } Looper.loop(); //Continue processing the results of all the use cases after the //loop has been asked to terminated via the handler 

Ein kleiner Hintergrund: Ich mache eine Bearbeitung auf dem UI-Thread, wo ich eine große Menge von Geräten pingen und etwas mit dem Ergebnis machen muss. Ich muss die Anfragen parallel durchführen, um effizient zu sein.

  • App aus Google Play programmgesteuert herunterladen
  • Fügen Sie neuen Kontakt über Absicht mit mehreren Telefonnummern hinzu
  • Anzeigen der Adresse, die in der E-Mail-Absicht vorgefüllt ist
  • Erweitern von Android View-Klasse, um einen dropshadow hinzuzufügen
  • Android: ADB Treiber für HTC One X
  • Gestenerkennung auf Fragment
  • Frage: Wenn einer dieser Anwendungsfälle irgendwie schnell genug ausgeführt und einen Rückruf gemacht hat, bevor ich Looper.loop () schlagen konnte; Würde die Nachricht in die Warteschlange gestellt oder einfach verloren gehen? Rückrufe werden zu diesem Thread zurückgesandt, indem der Handler ein Runnable auf den Original-Thread verschickt.

  • Finish () und den Activity Lifecycle
  • Kann jemand geben ein genaues Beispiel für Webview Umsetzung in Android
  • Bluetooth-Verbindung zwischen Android und einem anderen Telefon über das Freisprechprofil
  • Warum kann ich erfolgreich eine Datei in Linux verschieben, während es geschrieben wird?
  • Schließen Sie ByteArrayOutputStream in einer Android-Anwendung
  • Android bindService oder / und startService
  • One Solution collect form web for “Was passiert, wenn ein Handler eine Nachricht an einen Thread nach Looper.prepare () platziert, aber bevor Looper.loop () aufgerufen wurde?”

    Angenommen, Sie haben Looper.prepare () vor Ihrem useCaseProvider aufgerufen, die Ergebnisse liefert, sollten Sie gut sein. Wenn Looper.prepare nicht angerufen wurde, solltest du sehen, dass RuntimeException geworfen wird.

    Das Looper-Objekt ist an einen Thread gebunden, der die Nachrichtenwarteschlange hostet. Die Looper.prepare-Funktion wird diese Meldungswarteschlange konstruieren, an welcher Stelle Sie mit der Inbetriebnahme von Nachrichten beginnen können. Sobald du Looper.loop () ausgelöst hast, ist das, wenn die anstehenden Nachrichten beginnen werden.

    Wenn ich das Snippet betrachte, bin ich mir nicht sicher, wie die Dinge zusammengebunden sind. Im Allgemeinen willst du einen Looper so konstruieren:

     private static final class MyThread extends Thread { private Handler mHandler; @Override public void run() { Looper.prepare(); mHandler = new Handler() { @Override public void handleMessage(Message msg) { // handle message } }; Looper.loop(); } public Handler getHandler() { return mHandler; } } 

    Ich gehe davon aus, dass dein Fadenpool dann ein Pool von MyThread-Fäden ist, von denen jeder einen eigenen Looper hat. Der Thread-Pool sollte Ihre Threads initialisieren, sobald Sie ein Runnable liefern, das von Ihrem Thread ausgeführt werden soll, sollte die run () -Methode den Looper initialisiert haben.

    Auf der anderen Seite, wenn du deinen Handler mit einem bestimmten Looper verknüpfen möchtest (dh du baust den Handler nicht in einem Thread wie oben), dann solltest du den Looper-Thread in den Konstruktor wie:

     Handler h = new Handler(myLooperThread); 

    Wenn Sie das nicht angeben, verwendet der Handler den Thread, in dem er erstellt wurde, um den Thipper-Looper aus dem ThreadLocal-Objekt zu greifen.

    Schließlich, wenn Ihre Absichten haben, um Nachrichten auf dem Handler, die mit dem UI-Thread verbunden ist, dann sollten Sie nicht über das Aufrufen von Looper.prepare oder Looper.loop betroffen sein. Dies wird durch die Aktivität behandelt.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.