- 堆栈信息如下所示,从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)07−2513:05:44.81598952505250WMessageQueue:atandroidx.media3.exoplayer.ExoPlayerImplInternal.stop(ExoPlayerImplInternal.java:361)07−2513:05:44.81598952505250WMessageQueue:atandroidx.media3.exoplayer.ExoPlayerImpl.stopInternal(ExoPlayerImpl.java:1847)07−2513:05:44.81598952505250WMessageQueue:atandroidx.media3.exoplayer.ExoPlayerImpl.stop(ExoPlayerImpl.java:997)07−2513:05:44.81598952505250WMessageQueue:atcom.mega.sentinel.ui.activity.SentinelMediaVideoActivity.onDestroy(SentinelMediaVideoActivity.kt:453)07−2513:05:44.81598952505250WMessageQueue:atandroid.app.Activity.performDestroy(Activity.java:8239)07−2513:05:44.81598952505250WMessageQueue:atandroid.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1344)07−2513:05:44.81598952505250WMessageQueue:atandroid.app.ActivityThread.performDestroyActivity(ActivityThread.java:5097)07−2513:05:44.81598952505250WMessageQueue:atandroid.app.ActivityThread.handleDestroyActivity(ActivityThread.java:5142)07−2513:05:44.81598952505250WMessageQueue:atandroid.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:44)07−2513:05:44.81598952505250WMessageQueue:atandroid.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)07−2513:05:44.81598952505250WMessageQueue:atandroid.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)07−2513: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)
- 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就执行在哪个线程。
- 继续分析上面的异常:“sending message to a Handler on a dead thread”
可以看到mQuitting被设置为true的时候,在通过app sendMessage,就会打印上面的异常堆栈,那么又是哪里将mQuitting设置为true的呢?继续跟踪代码:
最终我们发现,当app调用了quit函数,就会设置mQuitting设置为true。也就是,当调用了quit函数之后,就不能继续往
MessageQueue发送message了。