19 Handler 总结

Handler

一, 回顾异步任务

AsyncTask

二, android 使用线程的规则

1,在主线程 不能做阻塞操作
2,在主线程之外的线程不能更新Ui

三, Handler的作用

1,在子线程中发送消息
2,在Ui线程获取消息和处理消息
note:Handler是 消息的发送者和消息的处理者

四: Message

Message 是线程之间消息的载体 包括对消息的描述 和任意数据的处理
Message 主要携带俩个int类型数据 和Object类型数据 还有个标记 what

五, Handler的消息处理机制

1,Handler 在工作线程发送消息和主线程接收和处理消息
对象:
final MessageQueue mQueue;封装好的Message对象 通过Handler发送到MessageQueue
final Looper mLooper;循环读取消息队列里的消息
方法:
handleMessage();处理Handler返回的消息(从Looper)

    ************************************************
    sendMessage() handler发送消息的方法
    sendMessageAtTime()  延时发送消息   定时(延时)
    sendMessageDelayed() 延时
    sendEmptyMessage(int what )根据标记发送空消息

    post()
    postAtTime(Runnable r, long uptimeMillis)
    postDelayed(Runnable r, long delayMillis)
    ******enqueueMessage(queue, msg, uptimeMillis)将消息发送到消息队列*******

>2,Message  携带线程间消息数据的载体

    属性:
    int what   标记
    int arg1   存整型的数据
    int arg2
    Object obj  存的复杂的数据
    Handler target; 标识当前消息发送给那个Handler 
    Messenger replyTo;  信使对象  APp夸进程的通信

    private static Message sPool; 消息池
    private static int sPoolSize = 0; 记录消息池中剩余消息的数量
    private static final int MAX_POOL_SIZE = 50;消息池中最多含有消息的数量

    方法:
     obtain()消息池中取消息
     recycle():使用完的Message对象及时回收
          setTarget(Handler target):设置接收消息的Handler对象
    sendToTarget():将消息发送到目标的Handler中
    setData(Bundle data):设置Bundle数据 到Message
    getData()从msg中获取Bundle对象





>3,MessageQueue:消息队列  相当于通道  (队列:先进先出)

`       方法:next()  从消息队列里取消息

>4,Looper: 消息泵   等待MessageQueue有消息的时候  将消息取出给Handler对象
    >

    属性:
        static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>(); 本地线程的变量  保证一个线程中只有一个Looper对象
        private static Looper sMainLooper; 主线程中Looper 对象

        final MessageQueue mQueue; 消息队列

    方法:
    prepare():准备Looper
    loop():循环读取MessageQueue中message  是无限循环   mQueue.next();等待

        myLooper():从线程本地变量中  获取当前线程的Looper对象

六 子线程向主线程发送消息

>1,在主线程里实例化一个Handler对象

>2,在子线程中发送消息

>3,在主线程里实例化一个Handler对象里的handlerMessage() 方法中进行处理消息

七 主线程向子线程发送消息

1,Looper.prepare() 获取Looper
2,实例化Handler对象(note:在1和3之间)
3,Looper.Loop() 无限循环 获取数据
4,在主线程中使用handler发送消息

转载于:https://www.cnblogs.com/muyuge/p/6152223.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值