我想从GUI线程设置HandlerThread。然后过一会儿,当在GUI上单击一个按钮时,它将运行callHello(),然后将消息发送到驻留在非GUI线程上的HelloLogger对象,该对象异步记录“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
  • How to create a Looper thread, then send it a message immediately?
  • Async calls with Handler
  • HandlerThread vs Executor - When is one more appropriate over the other?
  • Best use of HandlerThread over other similar classes
  • Android HandlerThread
  • HandlerThread examples
  • Android: Passing data between main and worker threads
  • Java Synchronised
  • Sending messages between threads using activity thread queue and Handler class
  • Intro to Loopers and Handlers
  • developer.android: Specifying the Code to Run on a Thread

  • 至少现在我可以关闭该死的标签

    解决方案由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");
            }
        }
    }
    

    最佳答案

    这是一个工作示例:

    HandlerThread ht = new HandlerThread("MySuperAwesomeHandlerThread");
    ht.start();
    Handler h = new Handler(ht.getLooper()) {
        public void handleMessage(Message msg) {
            Log.d(TAG, "handleMessage " + msg.what + " in " + Thread.currentThread());
        };
    };
    for (int i = 0; i < 5; i++) {
        Log.d(TAG, "sending " + i + " in " + Thread.currentThread());
        h.sendEmptyMessageDelayed(i, 3000 + i * 1000);
    }
    

    UPDATE :

    制作两个类字段:
    Handler mHtHandler;
    Handler mUiHandler;
    

    并尝试以下方法:
    HandlerThread ht = new HandlerThread("MySuperAwsomeHandlerThread");
    ht.start();
    Callback callback = new Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            if (msg.what == 0) {
                Log.d(TAG, "got a meaasage in " + Thread.currentThread() + ", now sleeping... ");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.d(TAG, "woke up, notifying ui thread...");
                mUiHandler.sendEmptyMessage(1);
            } else
            if (msg.what == 1) {
                Log.d(TAG, "got a notification in " + Thread.currentThread());
            }
            return false;
        }
    };
    mHtHandler = new Handler(ht.getLooper(), callback);
    mUiHandler = new Handler(callback);
    mHtHandler.sendEmptyMessageDelayed(0, 3000);
    

    您当然可以摆脱Callback接口(interface),并使用覆盖的handleMessage方法创建两个处理程序...

    关于android - 与HandlerThread通信的示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25094330/

    10-10 16:42