在最近的应用程序发布后,在 Crashlytics 中看到了这个崩溃。它100%在后台发生;50% 在索尼,一些在华为/小米,不在三星;Android 10 中为 79%,Android 8 中为 19%。
致命异常:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean android.os.Handler.sendEmptyMessageDelayed(int, long)”
在 xxx.xxx.xxx.MyEventManager$MyHandler.handleMessage(MyEventManager.java:80)
在 android.os.Handler.dispatchMessage(Handler.java:107)
在 android.os.Looper.loop(Looper.java:359)
在 android.os.HandlerThread.run(HandlerThread.java:67)
代码片段:
公共类 MyEventManager {
私有静态类 SingletonInstance {
私有静态最终 MyEventManager INSTANCE = new MyEventManager();
}
公共静态 MyEventManager getInstance() {
返回 SingletonInstance.INSTANCE;
}
私有处理线程 mHandlerThread;
私有处理程序 mHandler;
私有类 MyHandler 扩展 Handler {
public MyHandler(@NonNull Looper looper) {
超级(弯针);
}
@覆盖
公共无效句柄消息(@NonNull 消息消息){
super.handleMessage(消息);
开关(消息。什么){
案例 ACTION_SEND_REQUEST:
如果(isThreadReady()){
queryDatabaseAndSendRequest();
mHandler.sendEmptyMessageDelayed(ACTION_SEND_REQUEST, 600 * 1000);
}
休息;
默认:
休息;
}
}
}
私有布尔 isThreadReady() {
返回 mHandler != null && mHandlerThread != null && mHandlerThread.getState() != Thread.State.TERMINATED;
}
私人无效initHandlerThreadIfNeeded(){
如果(!isThreadReady()){
mHandlerThread = new HandlerThread(TAG_HANDLER);
mHandlerThread.start();
mHandler = new MyHandler(mHandlerThread.getLooper());
}
}
公共无效停止所有(){
如果(mHandler!= null){
mHandler.removeCallbacksAndMessages(null);
mHandler = null;
}
如果(mHandlerThread!= null){
mHandlerThread.quit();
mHandlerThread = null;
}
}
}
该类MyEventManager定期向服务器发送一些数据;正如您从代码片段中看到的那样,它调用mHandler.sendEmptyMessageDelayed()来handleMessage()安排下一个触发器。
该方法在'sstopAll()中调用。MainActivityonDestroy()
由于它在后台发生 100% 并mHandler设置为 null in stopAll(),所以我相信那MainActivity一刻已经被销毁了,但这很奇怪,因为任何待处理的消息都应该在调用mHandler.removeCallbacksAndMessages(null)时被删除stopAll(),此外,在调用之前有空检查mHandler.sendEmptyMessageDelayed().
谁能告诉我为什么我会得到 NPE?