Android面试线程—Asynctask和HandlerThread

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()来显示结果

Android面试线程—Asynctask和HandlerThread_第1张图片

注意事项:

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是一个串行队列,背后只有一个线程

你可能感兴趣的:(Android面试线程—Asynctask和HandlerThread)