面试题答案
一键面试管理线程避免ANR
- 主线程:主线程主要用于处理UI相关操作。在Messenger跨进程通信中,主线程不应直接处理耗时的通信任务,否则易导致ANR。应将通信相关的操作移到子线程中。
- 子线程:创建独立的子线程来处理Messenger的发送和接收消息逻辑。例如,可以使用
Thread
类或Coroutine
来启动子线程。// 使用Thread Thread { val messenger = Messenger(Handler(Looper.getMainLooper()) { msg -> // 处理主线程消息 true }) // 发送消息 val clientMessenger = Messenger(Handler(Looper.myLooper()!!) { msg -> // 处理子线程接收的消息 true }) val bundle = Bundle() bundle.putString("key", "value") val message = Message.obtain(null, 0, bundle) message.replyTo = clientMessenger try { messenger.send(message) } catch (e: RemoteException) { e.printStackTrace() } }.start() // 使用Coroutine GlobalScope.launch { val messenger = Messenger(Handler(Looper.getMainLooper()) { msg -> // 处理主线程消息 true }) val clientMessenger = Messenger(Handler(Looper.myLooper()!!) { msg -> // 处理子线程接收的消息 true }) val bundle = Bundle() bundle.putString("key", "value") val message = Message.obtain(null, 0, bundle) message.replyTo = clientMessenger try { messenger.send(message) } catch (e: RemoteException) { e.printStackTrace() } }
- 使用线程池:对于频繁的Messenger通信操作,可以使用线程池来管理子线程,避免创建过多线程导致系统资源耗尽。例如使用
Executors
创建线程池。val executorService = Executors.newFixedThreadPool(5) executorService.submit { // Messenger通信操作 }
不同线程在Messenger通信机制中的作用
- 主线程:
- UI更新:当从子线程通过Messenger接收到需要更新UI的消息时,主线程负责进行UI的更新操作。例如,当接收到网络请求完成的消息,主线程可以更新界面显示请求结果。
- 消息分发:主线程中的
Handler
负责接收从其他进程通过Messenger发送过来的消息,并将消息分发给对应的处理逻辑。
- 子线程:
- 通信任务执行:负责执行耗时的Messenger通信任务,如发送大量数据、进行复杂的计算后再发送结果等操作,避免阻塞主线程。
- 后台处理:当接收到需要进行后台处理的消息时,子线程进行相应的处理,处理完成后可以通过Messenger将结果返回给主线程或其他进程。