在最近的应用程序发布后,在 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()
中调用。MainActivity
onDestroy()
由于它在后台发生 100% 并mHandler
设置为 null in stopAll()
,所以我相信那MainActivity
一刻已经被销毁了,但这很奇怪,因为任何待处理的消息都应该在调用mHandler.removeCallbacksAndMessages(null)
时被删除stopAll()
,此外,在调用之前有空检查mHandler.sendEmptyMessageDelayed()
.
谁能告诉我为什么我会得到 NPE?