Asynctask
定义:
他本质上是一个封装了线程池和Handler的异步框架。
说明:
三个参数、五个方法
Params:初始值
Progress运行中值
Result输出结果
onPreExecute() 初始化
doInBackground() 异步运行耗时操作(唯一个子线程中的方法,其他方法都在UI线程)
onProgressUpdate() 更新数据UI
onPostExecute() 运行结束是调用
onCancelled()
具体执行步骤:
mAsyncTask.execute("haha");----->onPreExecute()----->doInBackground(String... params)----->onProgressUpdate(Integer... values)----->onPostExecute(Stringresult)
运行机制:
当调用异步任务的execute("haha")后,在其方法体内直接调用onPreExecute(),
执行onPreExecute()后开启一个线程池来启动一个Runnable在Runnable里面子线程去执行doInBackground(),
之后doInBackground()由于是在子线程故其使用mHandler.sendMessage()将处理好的结果向主线程发送一个消息onProgressUpdate()来更新进度以及onPostExecute()来显示结果
注意事项:
1.内存泄露(非静态内部类持有匿名外部应用)
2.结果丢失(如屏幕旋转,持有的对象是之前的Activity的对象,所以更新UI回无效)
3.并行和串行(2.3之前并行,2.3之后串行,2.3后也可通过方法改为并行)
4.生命周期(onDestroy中关闭Asynctask.cancel())
HandlerThread
定义:
HandlerThread本质上是一个线程,继承自Thread。有自己的Looper对象,可以进行Looper循环,可以创建Handler。
特点:
HandlerThread可以在Handler的handlerMessage中执行异步方法
HandlerThread优点是异步不会堵塞,减少对性能的消耗
HandlerThread缺点是不能同时继续进行多任务处理,需要等待进行处理,处理效率较低
HandlerThread与线程池不同,HandlerThread是一个串行队列,背后只有一个线程
网友评论