一、HandlerThread 的使用场景和用法?
HandlerThread 本质上是一个在子线程的handler(HandlerThread=Handler+Thread);
步骤1:创建HandlerThread实例对象
HandlerThread("handlerThread");
步骤2:启动线程
mHandlerThread.start();
步骤3:创建工作线程Handler&复写handleMessage
()Handler workHandler = new
Handler( handlerThread.getLooper() ) {
@OverRide
publicbooleanhandleMessage(Messagemsg){
...//消息处理
return true;
}
});步骤4:使用工作线程Handler向工作线程的消息队列发送消息
Message msg = Message.obtain();
msg.what = 2; //消息的标识
msg.obj = "B"; // 消息的存放
// b. 通过Handler发送消息到其绑定的消息队列
workHandler.sendMessage(msg);步骤5:结束线程,即停止线程的消息循环
mHandlerThread.quit();
优势:
- 将loop运行在子线程中处理,减轻了主线程的压力,使主线程更流畅
- 串行执行,开启一个线程起到多个线程的作用
- 有自己的消息队列,不会干扰UI线程劣势:
1.由于每一个任务队列逐步执行,一旦队列耗时过长,消息延时
2.对于IO等操作,线程等待,不能并发
二、IntentService 的应用场景和使用姿势?
IntentService 是 Service 的子类,默认为我们开启了一个工作线程,使用这个工作线程逐一处理所有启动请求,在任务执行完毕后会自动停止服务,使用简单,只要实现一个方法 onHandleIntent,该方法会接收每个启动
请求的 Intent,能够执行后台工作和耗时操作。可以启动多IntentService 次,而每一个耗时操作会以队列的方式
在 IntentService的 onHandlerIntent 回调方法中执行,并且,每一次只会执行一个工作线程,执行完第一个再执
行第二个。并且等待所有消息都执行完后才终止服务。IntentService 适用于 APP 在不影响当前用户的操作的前提下,在后台默默的做一些操作。
IntentService源码:
- 通过 HandlerThread 单独开启一个名为
IntentService 的线程- 创建一个名叫 ServiceHandler 的内部 Handler
- 把内部Handler与HandlerThread所对应的子线程进行绑
定- 通过 onStartCommand() 传递给服务 intent,依次插
入到工作队列中,并逐个发送给 onHandleIntent()- 通过 onHandleIntent() 来依次处理所有 Intent 请求对象所对应的任务
三、谈谈你对 Activity.runOnUiThread 的理解?
一般是用来将一个runnable绑定到主线程,在runOnUiThread源码里面会判断当前runnable是否是主线程,
如果是直接run,如果不是,通过一个默认的空构造函数handler将runnable post 到looper里面,创建构造函数
handler,会默认绑定一个主线程的looper对象
四、子线程能否更新UI?为什么?
#android面试#子线程是不能直接更新UI的。注意这句话,是不能直接更新,不是不能更新(极端情况
下可更新),绘制过程要保持同步(否则页面不流畅),而我们的主线程负责绘制ui,极端情况就是,在Activity的onResume含之前的生命周期中子线程都可以进行更新ui,也就是onCreate,onStart和onResume,此时主线程的绘制还没开始。