美文网首页
Handler、Looper、HandlerThread关系梳理

Handler、Looper、HandlerThread关系梳理

作者: 捉影T_T900 | 来源:发表于2020-06-02 14:38 被阅读0次

    一、一条核心对应关系:

    Thread(1):Looper(1):MessageQueen(1):Handler(n)

    (1)Thread:作为一个任务执行的独立环境,内部持有Looper、MessageQueen
    (2)Looper:本质是一个轮询器,在Thread内部运行,不断从MessageQueen中取出Message进行分发
    (3)MessageQueen:消息队列
    (4)Handler:Message的搬运工,将Message推至MessageQueen中

    二、HandlerThread的概念和使用

    鉴于以上对象过多,关系复杂,使用起来不方便,缩一Google退出了HandlerThread这个类方便更高效地使用Handler功能。

    如果没有HandlerThread,但又想实现子线程处理Handler任务分发功能的话,需要这样操作,显得复杂难懂:

    new Thread () {
        @Override
        public void run() {
            Looper.prepare();
            Hnadler handler = new Handler();
            Looper.loop();
        } 
    }
    

    HandlerThread本质上是一个Thread,做着普通的Thread做的工作。

    使用方法:

    public class MainActivity extends AppCompatActivity {
    
        Handler mainHandler, workHandler;
        HandlerThread handlerThread;
    
        TextView result;
        Button button1;
        Button button2;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            result = findViewById(R.id.result);
            button1 = findViewById(R.id.button1);
            button2 = findViewById(R.id.button2);
    
            // 主线程的handler
            mainHandler = new Handler();
    
            handlerThread = new HandlerThread("My HandlerThread");
            handlerThread.start();
    
            // handlerThread的handler
            workHandler = new Handler(handlerThread.getLooper()){
                @Override
                public void handleMessage(@NonNull Message msg) {
                    super.handleMessage(msg);
                    switch (msg.what) {
                        case 1:
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            Log.i("XXX", "workHandler:" + Thread.currentThread().getName());
                            mainHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    Log.i("XXX", "mainHandler:" + Thread.currentThread().getName());
                                    result.setText("第一次执行");
                                }
                            });
                            break;
                        case 2:
                            try {
                                Thread.sleep(3000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            Log.i("XXX", "workHandler:" + Thread.currentThread().getName());
                            mainHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    Log.i("XXX", "mainHandler:" + Thread.currentThread().getName());
                                    result.setText("第二次执行");
                                }
                            });
                            break;
                    }
                }
            };
    
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    workHandler.sendEmptyMessage(1);
                }
            });
    
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    workHandler.sendEmptyMessage(2);
                }
            });
    
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            handlerThread.quit();
            workHandler.removeCallbacksAndMessages(null);
        }
    
    }
    

    workerHandler内部运行的环境就已经是HandlerThread的独立线程环境了,缩一不允许在内部直接操作UI变化。

    (完)

    相关文章

      网友评论

          本文标题:Handler、Looper、HandlerThread关系梳理

          本文链接:https://www.haomeiwen.com/subject/jsxiohtx.html