Я хочу настроить HandlerThread из потока графического интерфейса. Затем, спустя некоторое время, когда нажата кнопка в GUI, она запускает callHello(), которая затем отправляет сообщение в объект HelloLogger, находящийся в потоке без GUI, который асинхронно регистрирует "Hello World". Я пробовал несколько вещей, некоторые блоки на неопределенный срок, некоторые никогда не получают сообщение и т.д. И т.д. Кодекс ниже более или менее близок к тому, который у меня есть, пожалуйста, может ли кто-нибудь изменить его на работу?
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");
}
}
}
Найденные примеры:
- HandlerThread Test
- Как создать поток Looper, а затем отправить его сообщение сразу?
- Асинхронные вызовы с обработчиком
- HandlerThread vs Executor - Когда еще один подход к другому?
- Лучшее использование HandlerThread над другими подобными классами
- Android HandlerThread
- Примеры HandlerThread
- Android: передача данных между основным и рабочим потоками
- Java Synchronized
- Отправка сообщений между потоками с использованием очереди потока действий и класса Handler
- Вступление в Loopers и Handlers
- developer.android: указание кода для запуска в потоке
По крайней мере, теперь я могу закрыть проклятые вкладки
Решение предоставлено с помощью 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");
}
}
}