Android FirebaseMessagingService创建Handler触发RuntimeException如何解决
问题根本原因
FirebaseMessagingService的onMessageReceived回调默认运行在后台工作线程,该线程未初始化Looper。你在stopPlayer方法中直接无参实例化Handler时,Handler默认会绑定当前调用线程的Looper,当前线程没有调用Looper.prepare()初始化Looper,就会抛出你遇到的崩溃异常。
修复方案
最简单的修复方式是明确指定Handler绑定应用主线程的Looper,修改stopPlayer的代码如下:
private void stopPlayer() { try { // 传入主线程Looper,避免依赖当前线程的Looper环境 new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { @Override public void run() { if (NotificationReceiverSoundPlay.mPlayer != null) NotificationReceiverSoundPlay.mPlayer.stop(); } }, 2000); } catch (IllegalStateException e) { e.printStackTrace(); } }
如果你不需要在主线程执行这个延迟任务,也可以选择其他替代方案:
- 改用
Timer+TimerTask实现延迟逻辑 - 使用协程的
delay方法实现延迟(仅项目使用Kotlin时可用) - 手动给当前后台线程初始化Looper,创建Handler后调用
Looper.loop(),但这种方案需要自行管理Looper生命周期,不推荐使用
内容的提问来源于stack exchange,提问作者Carwahan Your car partner
相关产品推荐
相关产品推荐

