Android---Handler消息机制

Handler消息机制
优点:
Android---Handler消息机制Android---Handler消息机制
Android---Handler消息机制
写法:
        1.主线程中创建一个Handler对象
            Handler handler = new handler(){};
        2.复写Handler对象的handlerMessage方法
            public void handleMessage(android.os.Message msg) { }
        3.在子线程中创建一个Message对象
            Message msg =  Message.obtain();
        4.将结果绑定给Message
            msg.obj = bitmap;
        5.使用主线程中的handler对象将message发送给主线程处理
            handler.sendMessage(msg);
        6.主线程中的handlerMessage方法接受子线程发来的Message对象;获取结果,处理Ui.
            Bitmap bitmap =  (Bitmap) msg.obj;
            iv_pic.setImageBitmap(bitmap);

例子:
   主线程:
        //☆☆1.在主线程创建一个Handler对象
        //☆☆2.复写Handler对象的handlerMessage方法
                    private Handler handler = new Handler(){
        //☆☆☆6.主线程中的handlerMessage方法接受子线程中发来的Message对象,做处理;
                    public void handleMessage(android.os.Message msg) {
        //该方法处于主线程,主线程可以更新UI。
                    String result = (String) msg.obj;
        //5.将字符串显示到TextView上。  ok
                tv_source.setText(result);
                        };
                    };

  子线程:
            //☆☆3.在子线程中创建一个Message对象
                    Message msg = new Message();
            //☆☆4.将网络访问获取的结果绑定到Message对象上
                    msg.obj = result;
            //☆☆5.使用主线程中创建的handler对象,发送一个Message对象到主线程
                    handler.sendMessage(msg);

原理:
    涉及对象: 
            Handler: 主要在子线程中将Message发送给主线程,在主线程中接受Message并处理。
                          每一个Handler实例,都有一个单独的线程与之配合。
            Message:一个消息对象,主要在子线程中绑定结果,携带到主线程。
            MessageQueue:位于主线程,是一个消息队列,接受子线程中发来的一个Message对象。
            Looper: 消息循环器,不断的从MessageQueue中取出一个个Message对象。

Android---Handler消息机制Android---Handler消息机制Android---Handler消息机制

常见消息处理api
1. 面试题:子线程不能够更新UI吗? 
        1.审计机制:activity完全展示之后,审计机制才会工作去检测子线程是否更新UI,如果更新就报错;        
                             Activity没有完全显示之前(onCreate方法没执行完毕),审计机制不会工作,就不会检测子线程中做的事情,
                             所以即使更新UI也不会报错。
        2.android中,与进度条相关的控件   也可以在子线程中更新UI.
        3.SurfaceView 也可在子线程中更新UI. 

2. Activity的方法, 不管当前所在线程是否是主线程,方法中的runnable都会被发送到主线程中执行
        runOnUiThread(new Runnable() {
            @Override
               public void run() {
                tv.setText("我被更改了");
               }
        });

3. handler.post方法,将执行的动作发送到主线程中执行
        handler.post(new Runnable() {
            @Override
                public void run() {    
                    tv.setText("我再次被更改了");
                }
            });
ps:主线程中需要创建handler对象  Handler handler = new Handler( );

4.handler.postDelayed方法,将执行的动作延时多长时间后发送到主线程中执行;  delayMillis:延时时间
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                    tv.setText("我再再再次被更改了");
                }
        }, 5000);

子线程相关
第四种方式有一个应用场景:展示广告多少秒后,跳转主界面。