打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android Handler与Looper

Handler与Looper经常用在异步消息处理里,当然大部分时间是与线程集合起来进行异步通信及处理的。

Android中的异步消息处理涉及Handler、Looper、Message和MessageQueue如下 :

Handler

Handler主要是消息发送和接收的处理者,负责发送Message到消息队列,以及处理Looper分派过来的Message。

Handler类可用于在主线程和工作线程中收发消息,Handler对象在工作线程中发送消息,该消息发送至消息队列中后等待处理。

在主线程中,Handler从消息队列中接收消息,并根据消息中的信息决定如何更新主线程中的UI。

Looper 

Looper扮演MessageQueue和Handler之间的桥梁角色,负责消息循环和消息派发,其去循环取出MessageQueue中的Message,并将取出的Message交付给相应的Handler处理。

Android应用程序是消息驱动的,Android系统提供了消息循环机制Looper,通过Looper和Handler实现消息循环机制。

Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。在Android系统中,Looper负责管理线程的消息队列(Message Queue)和消息循环。

3  MessageQueue

Message类用于存放消息中的数据,在通信时负责相关信息的存放和传递,类似于一个实体对象。

MessageQueue顾名思义就是消息队列,它是采用单链表的数据结构来存储消息列表,用来存放通过Handler发过来的Message,按照先进先出的顺序执行。

4 Handler 的一般用法 

Activity 中创建一个Handler,然后在子线程中发送消息。

public class MainActivity extends AppCompatActivity {  private TextView tv_text;
private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: // 把UI线程发送来的消息显示到屏幕上 tv_text.setText("what=" + msg.what + ", " + msg.obj); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_text = findViewById(R.id.tv_text); // 在UI线程中开启一个子线程 new Thread(new Runnable() { @Override public void run() { // UI线程发消息 Message msg = Message.obtain(); msg.what = 1; msg.obj = "向UI线程中发送消息!"; // 向子线程中发送消息 handler.sendMessage(msg); } }).start();    }}

5 Handler 的另一种用法  需要注意

子线程中创建的Handler,然后从主线程向子线程中发送消息。

public class MainActivity extends AppCompatActivity {    private Handler handler;    private TextView tv_text;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_text = findViewById(R.id.tv_text); // 在UI线程中开启一个子线程 new Thread(new Runnable() { @Override public void run() { // 在子线程中初始化一个Looper对象 Looper.prepare(); handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: // 把UI线程发送来的消息显示到屏幕上 Log.i("info", "what=" + msg.what + ", " + msg.obj); break; } } }; // 把刚才初始化的Looper对象运行起来,循环消息队列的消息 Looper.loop(); } }).start();

tv_text.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // UI线程发消息 Message msg = Message.obtain(); msg.what = 1; msg.obj = "向子线程中发送消息!"; // 向子线程中发送消息 handler.sendMessage(msg); } }); }}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android中的Handler, Looper, MessageQueue和Thread...
Android中的Handler的机制与用法详解
Android中的消息机制
Android 消息处理机制:Handler|Message
Android 消息机制(Looper Handler MessageQueue Message)
Android全面解析之由浅及深Handler消息机制
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服