繁体   English   中英

调用 Handler.sendEmptyMessageDelayed(int, long) 时出现 NullPointerException

[英]NullPointerException when invoking Handler.sendEmptyMessageDelayed(int, long)

在最近的应用程序发布后,在 Crashlytics 中看到了这个崩溃。 它 100% 发生在后台; 索尼 50%,部分华为/小米,而不是三星; 在 Android 10 中为 79%,在 Android 8 中为 19%。

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Handler.sendEmptyMessageDelayed(int, long)' on a null object reference
       at xxx.xxx.xxx.MyEventManager$MyHandler.handleMessage(MyEventManager.java:80)
       at android.os.Handler.dispatchMessage(Handler.java:107)
       at android.os.Looper.loop(Looper.java:359)
       at android.os.HandlerThread.run(HandlerThread.java:67)

代码片段:

public class MyEventManager {

    private static class SingletonInstance {
        private static final MyEventManager INSTANCE = new MyEventManager();
    }

    public static MyEventManager getInstance() {
        return SingletonInstance.INSTANCE;
    }

    private HandlerThread mHandlerThread;
    private Handler mHandler;

    private class MyHandler extends Handler {

        public MyHandler(@NonNull Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(@NonNull Message message) {
            super.handleMessage(message);

            switch (message.what) {
                case ACTION_SEND_REQUEST:
                    if (isThreadReady()) {
                        queryDatabaseAndSendRequest();
                        mHandler.sendEmptyMessageDelayed(ACTION_SEND_REQUEST, 600 * 1000);
                    }
                    break;

                default:
                    break;
            }
        }
    }

    private boolean isThreadReady() {
        return mHandler != null && mHandlerThread != null && mHandlerThread.getState() != Thread.State.TERMINATED;
    }

    private void initHandlerThreadIfNeeded() {
        if (!isThreadReady()) {
            mHandlerThread = new HandlerThread(TAG_HANDLER);
            mHandlerThread.start();

            mHandler = new MyHandler(mHandlerThread.getLooper());
        }
    }

    public void stopAll() {
        if (mHandler != null) {
            mHandler.removeCallbacksAndMessages(null);
            mHandler = null;
        }

        if (mHandlerThread != null) {
            mHandlerThread.quit();
            mHandlerThread = null;
        }
    }

}

MyEventManager类定期向服务器发送一些数据; 你可以从代码段看到,它调用mHandler.sendEmptyMessageDelayed()handleMessage()计划下一次触发。

MainActivityonDestroy()调用了stopAll()方法。

由于它在后台 100% 发生,并且mHandlerstopAll()设置为 null,所以我相信MainActivity在那一刻已被销毁,但这很奇怪,因为任何挂起的消息都应该在stopAll()时被mHandler.removeCallbacksAndMessages(null) stopAll()被调用,此外,在调用mHandler.sendEmptyMessageDelayed()之前mHandler.sendEmptyMessageDelayed()检查。

谁能告诉我为什么我会得到 NPE?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM