Android进阶Android 架构/模式Android

Handler的理解和使用

2017-02-24  本文已影响510人  慕涵盛华

1.Handler简介
2.Handler的用法
3.Android为啥要设计只能通过Handler机制去更新UI
4.Handler的原理
5.创建一个和线程相关的Handler
6.HandlerThread
7.Android中更新UI的几种方式
8.子线程中真的不能更新UI吗?

Handler

Handler的用法

执行结果会先显示1 再显示2

Android为啥要设计只能通过Handler机制去更新UI?

Handler的原理

s.png
创建一个和线程相关的Handler
class MyThread extends Thread{
    public  Handler handler;
    @Override
    public void run() {
          Looper.prepare(); //创建一个Looper对象
          handler = new Handler(){
               //此方法运行在子线程中
               @Override
               public void handleMessage(Message msg) {
                   System.out.println("当前的线程-->" + Thread.currentThread());
               }
          };
      Looper.loop(); //开始轮询
    }
}

MyThread thread = new MyThread();
thread.start(); //启动线程
//发送消息就会执行该handler的handleMessage方法(在子线程中)
thread.handler.sendEmptyMessage(1);

说明:在主线程中创建Handler时,主线程会自动创建Looper的,而自己在子线程中自定义handler机制时,需要手动创建Looper,并调用Looper的looper方法

HandlerThread

因为handleMessage方法运行在子线程,所以可以处理耗时的操作,使用HandlerThread,可以实现异步的操作,而不用考虑什么时候创建任务,取消任务等

Demo:主线程向子线程发送消息
private HandlerThread thread; 
private Handler threadHandler; //子线程中的handler 
//主线程中的handler 
private Handler handler = new Handler(){ 
    public void handleMessage(Message msg) {
       //在主线程中向子线程发送消息 
       threadHandler.sendEmptyMessageDelayed(1, 1000);
       System.out.println("主线程向子线程发送消息"); 
     };
 }; 

@Override 
protected void onCreate(Bundle savedInstanceState) {       
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     thread = new HandlerThread("异步子线程");
     thread.start(); 
     threadHandler = new Handler(thread.getLooper()){
          @Override 
           public void handleMessage(Message msg) {
                //在子线程中向主线程发送消息 
                handler.sendEmptyMessageDelayed(1, 1000);
                System.out.println("子线程向主线程发送消息"); 
         } 
    };
}

//按钮点击响应处理 
 public void click(View view){
     handler.sendEmptyMessage(1);
 }

说明:按钮点击时,handler就会发送消息,就会执行主线程中的handleMessage方法,在该方法中threadHandler就会向子线程发送消息,在子线程中handler又会发送消息,因此一直循环下去,可以在添加一个按钮,调用handler的removeCallbacks方法取消发送消息,从而结束循环

Android中更新UI的几种方式

不管是哪种方式内部都是通过handler发送消息来实现更新UI的

说明post里面封装的还是sendMessage

说明:runOnUiThread内部先判断当前线程是不是主线程,如果不是就通过handler发送一个消息

通过view自己post一个任务,该任务也是运行在主线程中的,内部也是通过handler发送消息来实现的

子线程中真的不能更新UI吗?

关注微信公众号获取更多相关资源

Android小先生
上一篇 下一篇

猜你喜欢

热点阅读