Handler (android.os.Handler) {d795040} sending message to a Handler on a dead thread问题解决

  1. 堆栈信息如下所示,从callstack来看,是向一个dead thread发送了一个message导致无法执行onMessage。那么问题来了,dead thread是哪个?是UI thread吗?

07-25 13:05:44.815989 5250 5250 W MessageQueue: Handler (android.os.Handler) {d795040} sending message to a Handler on a dead thread
07-25 13:05:44.815989 5250 5250 W MessageQueue: java.lang.IllegalStateException: Handler (android.os.Handler) {d795040} sending message to a Handler on a dead thread
07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.os.MessageQueue.enqueueMessage(MessageQueue.java:560)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.os.Handler.enqueueMessage(Handler.java:778)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.os.Handler.sendMessageAtTime(Handler.java:727)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.os.Handler.sendMessageDelayed(Handler.java:697)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.os.Handler.sendMessage(Handler.java:635)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.os.Message.sendToTarget(Message.java:468)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at androidx.media3.common.util.SystemHandlerWrapper S y s t e m M e s s a g e . s e n d T o T a r g e t ( S y s t e m H a n d l e r W r a p p e r . j a v a : 155 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t a n d r o i d x . m e d i a 3. e x o p l a y e r . E x o P l a y e r I m p l I n t e r n a l . s t o p ( E x o P l a y e r I m p l I n t e r n a l . j a v a : 361 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t a n d r o i d x . m e d i a 3. e x o p l a y e r . E x o P l a y e r I m p l . s t o p I n t e r n a l ( E x o P l a y e r I m p l . j a v a : 1847 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t a n d r o i d x . m e d i a 3. e x o p l a y e r . E x o P l a y e r I m p l . s t o p ( E x o P l a y e r I m p l . j a v a : 997 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t c o m . m e g a . s e n t i n e l . u i . a c t i v i t y . S e n t i n e l M e d i a V i d e o A c t i v i t y . o n D e s t r o y ( S e n t i n e l M e d i a V i d e o A c t i v i t y . k t : 453 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t a n d r o i d . a p p . A c t i v i t y . p e r f o r m D e s t r o y ( A c t i v i t y . j a v a : 8239 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t a n d r o i d . a p p . I n s t r u m e n t a t i o n . c a l l A c t i v i t y O n D e s t r o y ( I n s t r u m e n t a t i o n . j a v a : 1344 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t a n d r o i d . a p p . A c t i v i t y T h r e a d . p e r f o r m D e s t r o y A c t i v i t y ( A c t i v i t y T h r e a d . j a v a : 5097 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t a n d r o i d . a p p . A c t i v i t y T h r e a d . h a n d l e D e s t r o y A c t i v i t y ( A c t i v i t y T h r e a d . j a v a : 5142 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t a n d r o i d . a p p . s e r v e r t r a n s a c t i o n . D e s t r o y A c t i v i t y I t e m . e x e c u t e ( D e s t r o y A c t i v i t y I t e m . j a v a : 44 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t a n d r o i d . a p p . s e r v e r t r a n s a c t i o n . T r a n s a c t i o n E x e c u t o r . e x e c u t e L i f e c y c l e S t a t e ( T r a n s a c t i o n E x e c u t o r . j a v a : 176 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t a n d r o i d . a p p . s e r v e r t r a n s a c t i o n . T r a n s a c t i o n E x e c u t o r . e x e c u t e ( T r a n s a c t i o n E x e c u t o r . j a v a : 97 ) 07 − 2513 : 05 : 44.81598952505250 W M e s s a g e Q u e u e : a t a n d r o i d . a p p . A c t i v i t y T h r e a d SystemMessage.sendToTarget(SystemHandlerWrapper.java:155) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at androidx.media3.exoplayer.ExoPlayerImplInternal.stop(ExoPlayerImplInternal.java:361) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at androidx.media3.exoplayer.ExoPlayerImpl.stopInternal(ExoPlayerImpl.java:1847) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at androidx.media3.exoplayer.ExoPlayerImpl.stop(ExoPlayerImpl.java:997) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at com.mega.sentinel.ui.activity.SentinelMediaVideoActivity.onDestroy(SentinelMediaVideoActivity.kt:453) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.app.Activity.performDestroy(Activity.java:8239) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1344) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:5097) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:5142) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:44) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.app.ActivityThread SystemMessage.sendToTarget(SystemHandlerWrapper.java:155)072513:05:44.81598952505250WMessageQueue:atandroidx.media3.exoplayer.ExoPlayerImplInternal.stop(ExoPlayerImplInternal.java:361)072513:05:44.81598952505250WMessageQueue:atandroidx.media3.exoplayer.ExoPlayerImpl.stopInternal(ExoPlayerImpl.java:1847)072513:05:44.81598952505250WMessageQueue:atandroidx.media3.exoplayer.ExoPlayerImpl.stop(ExoPlayerImpl.java:997)072513:05:44.81598952505250WMessageQueue:atcom.mega.sentinel.ui.activity.SentinelMediaVideoActivity.onDestroy(SentinelMediaVideoActivity.kt:453)072513:05:44.81598952505250WMessageQueue:atandroid.app.Activity.performDestroy(Activity.java:8239)072513:05:44.81598952505250WMessageQueue:atandroid.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1344)072513:05:44.81598952505250WMessageQueue:atandroid.app.ActivityThread.performDestroyActivity(ActivityThread.java:5097)072513:05:44.81598952505250WMessageQueue:atandroid.app.ActivityThread.handleDestroyActivity(ActivityThread.java:5142)072513:05:44.81598952505250WMessageQueue:atandroid.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:44)072513:05:44.81598952505250WMessageQueue:atandroid.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)072513:05:44.81598952505250WMessageQueue:atandroid.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)072513:05:44.81598952505250WMessageQueue:atandroid.app.ActivityThreadH.handleMessage(ActivityThread.java:2066)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.os.Handler.dispatchMessage(Handler.java:106)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.os.Looper.loop(Looper.java:223)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at android.app.ActivityThread.main(ActivityThread.java:7670)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at java.lang.reflect.Method.invoke(Native Method)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:596)
07-25 13:05:44.815989 5250 5250 W MessageQueue: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

  1. Handler的Message执行线程具体是哪个?
    看一个简单的例子:

private Handler threadHandler;

new Thread(new Runnable() {
    @Override
    public void run() {
        Looper.prepare();
        threadHandler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(@NonNull Message msg) {
                return false;
            }
        });
        Looper.loop();
    }
}).start();

从google源码可以看出来: 一般来讲prepare()函数跑在哪个线程,那么Handler的Message就执行在哪个线程。
在这里插入图片描述

  1. 继续分析上面的异常:“sending message to a Handler on a dead thread”
    在这里插入图片描述

可以看到mQuitting被设置为true的时候,在通过app sendMessage,就会打印上面的异常堆栈,那么又是哪里将mQuitting设置为true的呢?继续跟踪代码:
在这里插入图片描述
最终我们发现,当app调用了quit函数,就会设置mQuitting设置为true。也就是,当调用了quit函数之后,就不能继续往
MessageQueue发送message了。

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值