当前位置: 首页 > 面试经验 >

【Android面试】 异步任务和消息机制面试题(一)

优质
小牛编辑
141浏览
2023-03-28

【Android面试】 异步任务和消息机制面试题(一)

一、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?为什么?



子线程是不能直接更新UI的。注意这句话,是不能直接更新,不是不能更新(极端情况
下可更新),绘制过程要保持同步(否则页面不流畅),而我们的主线程负责绘制ui,极端情况就是,在Activity的onResume含之前的生命周期中子线程都可以进行更新ui,也就是onCreate,onStart和onResume,此时主线程的绘制还没开始。


#android面试#
 类似资料: