Ich versuche etwas Neues auf Android, für das ich auf den Handler des UI-Threads zugreifen muss.
Ich kenne folgendes:
- Der UI-Thread verfügt über einen eigenen Handler und Looper
- Jede Nachricht wird in die Nachrichtenwarteschlange des UI-Threads gestellt
- Der Looper nimmt das Ereignis auf und gibt es an den Handler weiter
- Der Handler verarbeitet die Nachricht und sendet das spezifische Ereignis an die Benutzeroberfläche
Ich möchte meinen Dienst haben, der den UI-Thread-Handler abrufen und eine Nachricht in diesen Handler einfügen muss. Damit diese Nachricht verarbeitet und an die Benutzeroberfläche ausgegeben wird. Hier ist der Dienst ein normaler Dienst, der von einer Anwendung gestartet wird.
Ich würde gerne wissen, ob dies möglich ist. Wenn ja, schlagen Sie bitte einige Codefragmente vor, damit ich es versuchen kann.
Grüße Girish
quelle
Erstellen Sie ein
Messenger
an Ihr angehängtes ObjektHandler
und übergeben Sie esMessenger
an dasService
(z. B. in einemIntent
Extra fürstartService()
). DasService
kann dann ein senden ,Message
um dieHandler
über dieMessenger
. Hier ist eine Beispielanwendung, die dies demonstriert.quelle
Handler
, können Sie nicht darauf zugreifen, AFAIK.ViewRoot
im Android SDK, AFAICT.Handler
/ verwendenMessenger
, obwohl ich all das durch einen Eventbus ersetzen würde (z. B. den EventBus von greenrobot).Im Moment bevorzuge ich die Verwendung von Eventbusbibliotheken wie Otto für diese Art von Problem. Abonnieren Sie einfach die gewünschten Komponenten (Aktivität):
Geben Sie dann eine Rückrufmethode an:
und dann, wenn Ihr Dienst eine Anweisung wie folgt ausführt:
Dieses POJO wird an Ihre oben genannte Aktivität und alle anderen abonnierenden Komponenten weitergegeben. Einfach und elegant.
quelle
Ich schlage vor, folgenden Code zu versuchen:
quelle
Sie können Werte über den Broadcast-Empfänger abrufen ...... wie folgt: Erstellen Sie zunächst Ihren eigenen IntentFilter als,
Erstellen Sie dann den BroadcastReceiver der inneren Klasse als:
Registrieren Sie jetzt Ihren Rundfunkempfänger in onResume () als,
Und schließlich entfernen Sie die Registrierung von BroadcastReceiver in onDestroy () als,
Jetzt der wichtigste Teil ... Sie müssen die Sendung von jedem Ort aus starten, an dem Sie Werte senden müssen.
....Prost :)
quelle
So
kotlin
können Sie es machenAngenommen, Sie möchten eine Toast-Nachricht vom Dienst anzeigen
quelle
Lösung:
Handler
withLooper
from Main Thread: responseHandler- und override-handleMessage
MethodeRunnable
Rufen Sie innerhalb der Task sendMessage für responseHandler aufsendMessage
Ergebnisaufruf von handleMessage in responseHandler.Message
und verarbeiten Sie es, aktualisieren Sie die BenutzeroberflächeBeispielcode:
quelle