0

在最近的应用程序发布后,在 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?

4

0 回答 0