Android---Handler消息机制

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对象。



常见消息处理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);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值