[英]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()
计划下一次触发。
在MainActivity
的onDestroy()
调用了stopAll()
方法。
由于它在后台 100% 发生,并且mHandler
在stopAll()
设置为 null,所以我相信MainActivity
在那一刻已被销毁,但这很奇怪,因为任何挂起的消息都应该在stopAll()
时被mHandler.removeCallbacksAndMessages(null)
stopAll()
被调用,此外,在调用mHandler.sendEmptyMessageDelayed()
之前mHandler.sendEmptyMessageDelayed()
检查。
谁能告诉我为什么我会得到 NPE?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.