Ich möchte einen HandlerThread aus dem GUI-Thread einrichten. Einige Zeit später, wenn auf der GUI auf eine Schaltfläche geklickt wird, wird callHello() ausgeführt, das dann eine Nachricht an ein HelloLogger-Objekt sendet, das sich auf dem Nicht-GUI-Thread befindet, der “Hello World” asynchron protokolliert. Ich habe eine Reihe von Dingen ausprobiert, einige blockieren auf unbestimmte Zeit, andere erhalten die Nachricht nie usw. usw. Der folgende Code ist mehr oder weniger so nah wie ich, könnte ihn bitte jemand ändern, damit er funktioniert?
public class HandlerThreadExample {
private MyHandlerThread mMyHandlerThread;
private Looper mLooper;
private Handler mHandler;
public HandlerThreadExample(){
mMyHandlerThread = new MyHandlerThread();
mMyHandlerThread.start();
mLooper = mMyHandlerThread.getLooper();
}
public void callHello() {
mHandler.sendEmptyMessage(1);
}
private class MyHandlerThread extends HandlerThread {
private HelloLogger mHelloLogger;
private Handler mHandler;
public MyHandlerThread() {
super("The MyHandlerThread thread", HandlerThread.NORM_PRIORITY);
}
public void run (){
mHelloLogger = new HelloLogger();
mHandler = new Handler(getLooper()){
public void handleMessage(Message msg){
mHelloLogger.logHello();
}
};
super.run();
}
}
private class HelloLogger {
public HelloLogger (){
}
public void logHello(){
Log.d("HandlerThreadExample", "Hello World");
}
}
}
Beste gefundene Beispiele:
- HandlerThread-Test
- Wie erstelle ich einen Looper-Thread und sende ihm dann sofort eine Nachricht?
- Asynchrone Aufrufe mit Handler
- HandlerThread vs. Executor – Wann ist einer besser geeignet als der andere?
- Beste Verwendung von HandlerThread gegenüber anderen ähnlichen Klassen
- Android-HandlerThread
- HandlerThread-Beispiele
- Android: Übergeben von Daten zwischen Haupt- und Worker-Threads
- Java-synchronisiert
- Senden von Nachrichten zwischen Threads mithilfe der Aktivitäts-Thread-Warteschlange und der Handler-Klasse
- Einführung in Looper und Handler
- developer.android: Angeben des Codes, der in einem Thread ausgeführt werden soll
Wenigstens kann ich jetzt die verdammten Tabs schließen
Lösung mit freundlicher Genehmigung von pskink
public class HandlerThreadExample2 {
private static int MSG_START_HELLO = 0;
private static int MSG_HELLO_COMPLETE = 1;
private HandlerThread ht;
private Handler mHtHandler;
private Handler mUiHandler;
private boolean helloReady = false;
public HandlerThreadExample2(){
ht = new HandlerThread("The new thread");
ht.start();
Log.d(App.TAG, "UI: handler thread started");
mUiHandler = new Handler(){
public void handleMessage(Message msg){
if (msg.what == MSG_HELLO_COMPLETE){
Log.d(App.TAG, "UI Thread: received notification of sleep completed ");
helloReady = true; }
}
};
mHtHandler = new Handler(ht.getLooper()){
public void handleMessage (Message msg){
if (msg.what == MSG_START_HELLO){
Log.d(App.TAG, "handleMessage " + msg.what + " in " + Thread.currentThread() + " now sleeping");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(App.TAG, "Woke up, notifying UI thread...");
mUiHandler.sendEmptyMessage(MSG_HELLO_COMPLETE);
}
}
};
}
public void sendLongHello(){
if (helloReady){
Log.d(App.TAG, "sending hello " + Thread.currentThread());
mHtHandler.sendEmptyMessage(MSG_START_HELLO);
helloReady = false;
} else {
Log.e(App.TAG, "Cannot do hello yet - not ready");
}
}
}
Denken Sie, Sie können das in 4 Zeilen Code mit tun github.com/greenrobot/EventBus
– cYrixmorten
2. August 14 um 11:09 Uhr
Sehr interessant, danke, werde das ein anderes Mal untersuchen. +1. Aber ich denke, ich sollte gehen, bevor ich laufe
– CL22
2. August 14 um 11:13 Uhr
Kein Problem, aber um ganz ehrlich zu sein, habe ich es aufgegeben, Handler und Nachrichten zu verwenden, obwohl ich viel Android-Code geschrieben habe. Keine Notwendigkeit, es kompliziert zu machen, wenn es meiner Meinung nach sehr einfach, lesbar und wartbar ist 🙂
– cYrixmorten
2. August 14 um 11:15 Uhr
Gott weiß, ich weiß, wo du herkommst!!!! Etwas sagt mir, dass dies eine Kopfgeldfrage sein wird, lol
– CL22
2. August 14 um 11:24 Uhr
1) Erstellen Sie einen neuen HandlerThread, 2) starten Sie ihn, 3) erstellen Sie einen neuen Handler. Verwenden von ht.getLooper() als Looper-Parameter, 4) Senden einer Nachricht
– Pskink
2. August 14 um 11:38 Uhr