Android知识点总结(十三) Handler、Looper消息队列模型,各部分的作用

相关文章:

Android 知识点总结(目录) https://blog.csdn.net/a136447572/article/details/81027701、

Handler能够让你发送和处理消息,以及Runnable对象;每个Handler对象对应一个Thread和

Thread的消息队列。当你创建一个Handler时,它就和Thread的消息队列绑定在一起,然后就可以

传递消息和runnable对象到消息队列中,执行消息后就从消息队列中退出。

  Handler的作用就是:调度消息和runnable对象去被执行;使动作在不同的线程中被执行。

  当一个应用程序中进程被创建时,它的主线程专门运行消息队列(messageQueue),去管

理顶层的应用程序相关的对象如:activity,broadcastReceiver,windows等,你可以创建你

的Thread,和主线程进行交互——通过Handler,交互的方法就是通过post或者sendMessage。

但是在你的新线程中,给定的Message或者Runnable,会在适当的时候的被调度和处理。

(即不会被立即处理——阻塞式)。

无 looper 在线程中发送


        handler.sendEmptyMessage(0x11);//无携带数据发送

        Message msg = new Message();
        Bundle bundle = new Bundle();
        bundle.putString("key","value");
        msg.setData(bundle);
        msg.what = 0x12 ;
        handler.sendMessage(msg); //有携带数据发送

定义Handler

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (msg.what == 0x11){
                Log.i("info","处理正常逻辑");
            }
            if (msg.what == 0x12){
                Bundle bundle = msg.getData();
                String value = bundle.getString("key");
                Log.i("info","value="+value );
            }
        }
    };

ThreadHandlerThread 的区别

Thread 中没有looper HandlerThread 中系统默认创建Looper 可通过Handler 进行消息的传递

创建子线程的Handler

 HandlerThread handlerThread = new HandlerThread("HandlerThread");
        handlerThread.start();

        Handler mHandler = new Handler(handlerThread.getLooper()){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what==0x11){

                    new Timer().schedule(new TimerTask() {
                        @Override
                        public void run() {
                            ss++;
                            //处理耗时的功能  处理完后发送到主线程的Handler 
                            Message msgd = new Message();
                            Bundle bundle = new Bundle();
                            bundle.putString("key",""+ss);
                            msgd.setData(bundle);
                            msgd.what = 0x12 ;
                            zHandler.sendMessage(msgd);   
                        }  
                    }, 1000,1000);


                }
            }
        };

        mHandler.sendEmptyMessage(0x11);

主线程中的Handler


  Handler zHandler = new Handler(){
         @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (msg.what == 0x12){
                Bundle bundle = msg.getData();
                String value = bundle.getString("key");
                text1.setText(value+"");
            }

        }
    };

你可能感兴趣的:(andriod)