Handler(可以取代 异步任务):
作用: 在子线程 和 主线程 之间 发送,接收,处理 消息.
原理: Handler中有
Looper类(循环接收Message消息(相当于Handler的”秘书”),并发送给Handler对象), Looper对象中有 MessageQueue类(Message队列:用来存放Message) ;
Handler的常用方法:
接收消息(Message类)的 方法:
handleMessage(Message msg) //处理返回给 handler的消息
发送消息的 方法:
.sendMessage(Message msg) //发送 消息(发送的 普通消息:基本类型 和 Object引用类型)
.post(Runnable r) //发送 消息(发送的是 线程)
Message类(消息类/它本身即是消息, 是 存放数据的容器/载体 )
存放数据的 不同消息的属性(也就是将 数据类型分类 存放):
.what //存放空(empty) 消息
.arg1 和 .arg2 //存放 整型数据
.obj //存放Object类型 数据
.data //存放 Bundle类型 数据
存放message.setData(data)
/ 接收:
Bundle data = message.getData();
获取Message的对象的方法:
1, 通过构造方法获得(不建议使用):
Message message = new Message();
2, 通过Message的静态方法:
Message message = Message.obtain();
3, 通过Handler的方法:
Message message = handle.obtainMessage();
消息传递 方向:
- 子(线程) 给 主(线程)(Handler在主线程接收Message) 发消息(Object / 线程):
主线程 自带Looper对象(但子线程 需要手动创建Looper对象), Handler实例化对象创建在哪个线程, 哪个线程
就是Handler接收信息的 线程!!!
- 主(线程) 给 子(线程)(Handler在子线程接收Message) 发消息(Object / 线程):
注意: 由于子线程没有现成的 Looper(接收消息的对象) 所以需要 :
Looper.prepare(); //1.创建looper对象 ... // 2. New Handler(){ Message } Looper.loop(); //3.启动looper对象 用来循环接收Message