如何解决调用Handler.sendEmptyMessageDelayedint,long时发生NullPointerException
最近发布应用后,在Crashlytics中看到了该崩溃。它在后台发生100%;索尼有50%,华为/小米有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; } } }
类itemReader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy());
定期向服务器发送一些数据;从代码段中可以看到,它在MyEventManager
中调用mHandler.sendEmptyMessageDelayed()
安排下一个触发器。
在handleMessage()
的{{1}}中调用方法stopAll()
。
由于它是在后台100%发生的,并且MainActivity
在onDestroy()
中设置为null,所以我认为mHandler
当时已被销毁,但这很奇怪,因为任何待处理的消息应该会在调用stopAll()
时被MainActivity
删除,此外,在调用mHandler.removeCallbacksAndMessages(null)
之前存在空检查。
谁能告诉我为什么我要获得NPE?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。