首页 > 编程知识 正文

简述handler机制及其作用,handleradapter原理

时间:2023-05-06 00:32:37 阅读:201635 作者:568

1.Handler是什么?

Handler是android提供用于更新UI的一套机制,也是消息处理机制。也可以说是消息传递机制。

Handler的主要作用有2个

     1.在新启动的线程中发送消息

     2.在主线程即UI线程中获取并处理消息

说明:启动一个APP时,首先会开启一个主线程(UI线程),主要管理UI界面,更新UI等操作

a.如果进行一个耗时的操作,请求后台数据,并更新UI。这时候请求后台数据是需要时间的,不能放在主线程中进行。需要开启一个子线程来执行请求数据的操作

b.请求完成后,需要更新UI,就需要用到Handler了,Handler运行在主线程中,通过Message对象来传递数据,子线程发送Message对象给主线程,接收消息并处理更新UI等操作。

使用方法:

private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); tv.setText("msg.arg1:"+msg.arg1+"--msg.arg2:"+msg.arg2); } }; new Thread(new Runnable() { @Override public void run() { Message msg = new Message();//消息对象 msg.arg1 = 99;//携带参数 msg.arg2 = 100;//携带参数 Object str = new Object();//实例化对象 msg.obj = str; //携带参数为实体类对象 handler.sendMessage(msg) } });

 

2.Handler的主要方法

handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主程),它有两个作用:

        (1)合理调度安排消息和runnable对象,使它们在将来的某个点被执行.

        (2)安排一个动作在不同的线程中执行

Handler中开启线程和分发消息的一些方法:

      post(Runnable)直接开启Runnable线程

      postAtTime(Runnable,long)在指定的时间long,开始启动线程

      postDelayed(Runnable long)在延迟long时间后,启动Runnable线程

      sendEmptyMessage(int) 发送指定的消息,通过参数int来区分不同的消息

      sendMessage(Message)发送消息到UI线程中

      sendMessageAtTime(Message,long)     这个long代表的是系统时间,不推荐用

     sendMessageDelayed(Message,long)    此方法long代表调用后几秒后执行。

   sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

handler基本使用: 1)在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在 handleMessage 中提供收到消息后相应的处理方法即可。(接收消息,并且更新UI)

                     2)在新启动的线程中发送消息

 

a.Message  

Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。使用Message的arg1和arg2便可携带int数据,使用obj便可携带Object类型数据。

2.Handler
  Handler顾名思义就是处理者的意思,它只要用于在子线程发送消息对象Message,在UI线程处理消息对象Message,在子线程调用sendMessage方法发送消息对象Message,而发送的消息经过一系列地辗转之后最终会被传递到Handler的handleMessage方法中,最终在handleMessage方法中消息对象Message被处理。

3.MessageQueue
  MessageQueue就是消息队列的意思,它只要用于存放所有通过Handler发送过来的消息。这部分消息会一直存放于消息队列当中,等待被处理。每个线程中只会有一个MessageQueue对象,请牢记这句话。其实从字面上就可以看出,MessageQueue底层数据结构是队列,而且这个队列只存放Message对象。

4.Looper
  Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当MesssageQueue中存在一条消息,Looper就会将这条消息取出,并将它传递到Handler的handleMessage()方法中。每个线程只有一个Looper对象。

 

理解以上成员后,理解就很简单了。

子线程发送消息,主线程接收消息。

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。