• 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发送消息

  • 相关阅读:
    备份的数据库存儲過程
    用反射调用任意.net库中的方法
    基于.NET的多线程编程入门
    手写分页函数C#
    .net中的泛型
    prototype.js开发笔记
    此方法用于确认用户输入的不是恶意信息
    利用DataSet、DataTable、DataView按照自定义条件过滤数据
    读取文件列表
    注册客户端脚本
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152223.html
Copyright © 2020-2023  润新知