Handler And AsynckTask
Handler and AsynckTask : 都是用来实现异步的流程里更新主线程中的ui的变量(自己定义的)
区别:
Handler:
优点:结构清晰,功能定义明确,适用于多个后台任务(简单,清晰)。
缺点:在单个后台异步处理时,显的代码过多,结构过于复杂(相对于AsyncTask而言)。
AsyncTask:
优点:简单,快捷,过程可控。
缺点: 在使用多个异步操作和并需要进行ui更新是,就显得复杂。
Handler 的实战和理解
Handler,MessagerQueue, Looper之间的联系;
每一个线程都可以拥有一个Looper对象,Looper对象内部又拥有一个MessageQueue对象,MessageQueue就是消息队列,Looper负责从MessageQueue中,不断取出Message,然后执行相应的代码块调用。当要更新UI时通过sendEmptyMessage(int messageWhat)的方法向Handler发送一个消息,于此同时也将这个消息post到了MessageQueue的消息队列中Looper的Looper.next()就负责将这个消息从messageQueue的队列中取出来发送到handleMessage()的方法中进行更新UI;
AsyncTask 的实战和理解
参数解释
这三个参数会在类继承时被指定,参数都使用泛型构造。
Params 后台线程所需要的参数列表,与构造类时所指定的第一个参数类型匹配。
Progress 后台线程执行过程中发送的进度信息, 与构造类时所指定的第二个参数类型匹配。
Result 后台线程执行完后的返回值, 与构造类时所指定的第三个参数类型匹配。
AsyncTask 执行的4个阶段
step1
onPreExecute()在主线程(UI线程)调用,用于开始任务前的初始化工作。例如显示一个进条。
step2
doInBackground(Params...) 后台线程调用,onPreExecute() 执行完之后立即执行。用于执行耗时较长的操作。并且提供publishProgress(Progress...)方法用于显示进度信息。
step3
onProgressUpdate (Progress...)在主线程(UI线程)调用,用于响应publishProgress(Progress...)方法。
step4
onPostExecute(Result) 在主线程调用,doInBackground(Params...)方法执行完后立即调用。Result是doInBackground(Params...)方法的返回值。
例: