Handler 使用笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21700489/article/details/78717942
Google官方文档介绍

Handler允许你发送和处理与某个线程相关联的MessageRunnable对象。每一个Handler实例与单个线程以及该线程唯一的MessageQueue相关联。在哪个线程中建立Hander对象,该Handler对象自动会绑定到哪个线程中,并且同时与该线程的MessageQueue和Looper建立起关联关系。从那时起,Handler将会向消息队列MessageQueue传递Message或Runnable对象,并且在他们从消息队列中出来的时候执行它们。

Handler的两个主要用途:

  • 安排Message和Runnable在将来的某个时间点运行
  • 将action入队以便在一个不同的线程中运行(即能够实现线程之间的通信。比如说当你创建一个子线程后,可以在该子线程中获取父线程中创建的Hander对象,就能通过该对象向父线程的消息队列发送消息了。)

注意事项

  • 在子线程(即非UI线程)初始化Handler首先要执行Looper.prepare();

子线程更新UI实例

步骤:
  1. 在UI主线程中创建Handler对象
  2. 构建Runnable对象。在Runnable中编写更新UI的相关代码
  3. 在子线程的run方法中向UI线程post runnable对象来更新UI
public class MainActivity extends BaseActivity{

  private Handler mHandler;
  private String  data;

     public void onCreate(Bundle savaInstanceState){
         mHandler=new Handler();
         ...//省略


         view.setOnClickListener(view ->{

              //开启一个后台线程处理耗时的操作
              new Thread(()->{           

                  final DownFiles df=new DownFiles("http:....");
                  data  = df.downLoadFiles();

                  //在A线程中用B线程的Hander对象发送Message或者Runnable对象
                  //会在A线程中接受和处理Message或者Runnable对象
                  handler.post(()->{ view.setText(data)});

              }).start();
         });
     }
}

注意:以上代码片段为了看起来更简洁使用了Lambda表达式


猜你喜欢

转载自blog.csdn.net/qq_21700489/article/details/78717942