Handler(完成子线程和主线程的通信)
当启动一个Android应用程序的时候,系统会为当前的程序创建一个进程,这个进程中会创建一个主线程,这个主线程会运行一个消息队列(Message Queue),这个消息队列是用来管理一个应用程序中最高级别的一些对象(四大组件).在Android程序中可以自己创建子线程(work thread),然后通过Handler和程序的主线程进行通信.
handler: 允许发送和处理和一个线程的消息队列相关的Message对象或者是Runnable对象.
handler 只会和一个线程以及这个线程的消息对列关联.handler会和创建的线程以及该线程的消息队列绑定. handler往绑定的线程的消息队列中传递Message或Runnable,并且当被传递的Message或者是Runnable被从该线程的消息队列中取出来之后,handler还可以处理他们.
handler的两种用法:1.分配Message对象 2.在另外一个线程添加一段操作
当使用Handler实现子线程和主线程的通信的时候可以调用post版本的方法实现也可以sendMessage版本的方法实现.
对于post系列的方法和sendMessage系列的方法分别有3种:1.立刻执行 2.延时执行 3.在一个绝对时间执行
SystemClock.uptimeMillis()返回值表示手机从开机到该方法被调用的时间段
//主线程不能执行耗时操作(网络请求)
//子线程不能操作UI
//通过Handler把子线程产生的数据发送到主线程
handler.sendEmptyMessage(i);//创建只有what字段的Message对象,并且发送到主线程中
用 Handler 实现线程通信的相关对象: Handler MessageQueue Message Looper (用Handler实现线程间的通信模型相关的4个对象)
以子线程向主线程发送数据为例, Handler 通信模型的工作方式: 在主线程中创建 Handler 对象,该Handler对象,该Handler对象就和主线程的消息队列关联,在子线程中通过该Handler对象发送一个携带有数据的Message 对象,因为该 Handler 是和主线程关联的,所以通过该 Handler 发送 Message 的时候,该 Message 会被发送到主线程的 MessageQueue. 主线程的MessageQueue会有一个Looper对象实时监测主线程的MessageQueue,当主线程的MessageQueue中有新的Message被发送过来之后,Looper对象就会把该Message对象从主线程的 MessageQueue 中取出交给 Handler 进行处理, Handler 的 handleMessage() 方法就会最终接受该 Message 对象(取数据进行处理).
通过post系列的方法实现线程间的通信,用到的是Runnable
通过sendMessage方法实现线程间的通信,要用到Message传递数据.
Message类的作用:作为线程间通信的使者(携带数据)
Message类有4个常用的属性:
1. what 整数 表示Message的id
2. obj Object 携带引用数据类型
3. arg1 整数 没有特定含义 用于携带整数数据
4. arg2 整数 没有特定含义 用于携带整数数据
创建Message对象的时候可以通过共有的构造方法但是最好使用