Handler原理图:
说明:
1.子线程借助主线程中的handler发送一条消息到主线程。(handler.sendMessage()方法)
2.这个消息会被主线程加入到消息队列MessageQuene中
3.主线程中有一个looper轮询器,会发现消息队列中有一条消息,调用handler消息处理方法handlemessage()去处理这个消息
4.在handlemessage()方法里更新UI
异步消息处理线程
异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环。若消息队列为空,线程则会阻塞等待。其实Looper负责的就是创建一个MessageQueue,然后进入一个无限循环体不断从该MessageQueue中读取消息,而消息的创建者就是一个或多个Handler 。
AsyncTask
首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。
使用
参数
AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
方法
1.doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publishProgress(Progress…)来更新任务的进度。
2.onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
3.onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
4.onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
5.onCancelled() 用户调用取消时,要做的操作
Handler与AsyncTask的区别
数据简单使用AsyncTask:实现代码简单,
数据量多且复杂使用handler+thread :相比较AsyncTask来说能更好的利用系统资源且高效