1.Handler消息传递机制
通过结合Handler与Message可简单有效地实现线程之间的通信。
传递消息的步骤主要有4步:
- 在主线程构造一个Handler对象,并启动分线程
关键代码
Handler handler=new Handler();
{
public void handleMessage(android.os.Message msg)
{
if(msg.what==0x123){tv.setText("");}
}
}`
.
- 在分线程中构造一个Message对象的消息包
Message是多线程通信中存放消息的包裹,作用类似有Intent机制的Bundle工具。实例可通过的obtain方法 获得,也可以通过Handler对象的obtianMessage方法获得。
public static Message obtian(Handler h,int what,int arg1,int arg2,Object obj)
参数说明
- what:整形的消息标识,用于标识本次消息的唯一编号。
- arg1:整型数,可存放消息的处理结果。
- arg2:整形数,可存放消息的处理代码。
- obj:Object类型,可存放返回消息的数据结构。
- replyTo:Message类型,回应信使,在挂进程通信使用。
3.在分线程中通过Handler对象将Message消息发出去
处理器Handler的消息发送操作主要是各类send方法
- obtainMessage()
- sendMessage()
- sendMessageDelayed()
- sendMessageAtTime()
- sendEmptyMessage()
- removeMessage()
- hasMessage()
4主线程中Handler对想处理接受到的消息
主线程处理分线程发出的消息需要实现Handler对象的handleMessage方法,根据Message的消息具体内容分别进行相应处理。
所以可以用来作为更新UI的一种方法
2.使用AsyncTask异步任务
AsyncTask这个轻量级的异步任务工具。内部已经封装好Thread+Handler的线程通信。
所以只需编写业务代码即可。(AsyncTask通常用于网络访问操作,包括HTTP接口调用、文件下载与上传)
开发者自定义的任务类需要实现以下方法
- onPreExecute:准备执行任务时触发。
- doInBackground:在后台执行的业务处理》网络请求等异步处理操作都放在该方法中
- onPostExecute:任务执行完成是触发。
- onCancelled:调用任务对象的cancel方法时触发。
更新UI的操作只能在onPostExecute(String result)方法中
3.使用runOnUiThread(action)方法
runOnUiThread(new Runnable){
.....
}
主要的业务逻辑代码在runOnUiThread
4.使用Handler的post(Runnable r)方法
主要代码
Handler handler = new Handler();
handler.post(new Runnable){}
解释下Handler机制
Handler有这样三个特点:
1.允许你去发送并处理一条与Runnable对象和MessageQueue相关联的消息
2.每个Handler实例都与一个单独的线程和该线程的MessageQueue相关
3.当你创建一个新的处理程序是,它将绑定到正在创建的线程的线程/消息队列
构造方法:如果要对发送的消息进行操作则需要覆写handleMessage方法
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){//}
}
调用函数:post(Runnable r)将Runnable添加到MessageQueue中。如果发送的是runnable则忽略掉handleMessage方法的执行。
-
postAtTime(Runnable r,long updateMillis)在指定的时间点运行runnable
-
postDelayed(Runnable r,long delayMillis)在延迟一段时间后运行runnable
Handler常用类,四个组成部分
1.Message 消息,被传递和处理的数据
public static Message obtian(Handler h,int what,int arg1,int arg2,Object obj)
2.MessageQueue:消息队列,本质是一个数据结构,用来存放Handler发送过来的消息,按照先进先出执行。
3.Handler处理者,负责Message的发送及处理。
4.Looper:循环器,不断从MessageQueue中抽取Message。
5.Thread:线程,负责调度整个消息循环。
在非主线程中创建handler
a.手动进行Looper.prepare()及Looper.loop()、Looper.myLooper().quit();
b.利用HandlerThread类进行创建。HandlerThread继承Thread,它会启动一个带looper的新线程,但是必须要调用start()方法。
Android多线程的四大组件
- IntentService(只能依次处理,一个接一个) service+Handler+HandlerThread
- HandlerThread Handler+线程+Looper
- AsyncTask Handler+线程池
- Handler 安卓多线程基础组件
按照使用频率又少到高