【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面试#
全部评论
想知道面试的时候是以什么形式出题啊
点赞 回复 分享
发布于 2023-02-13 16:12 广东

相关推荐

某牛奶:一觉醒来全球程序员能力下降200%,小伙成功scanf惊呆在座个人。
点赞 评论 收藏
分享
评论
15
1
分享
牛客网
牛客企业服务