Java 如何修复';SuperNotCalledException“;关于onDestroy?
我在片段中使用onDestroy来确保在退出应用程序时停止处理程序(用于设置按钮动画),如下代码所示:Java 如何修复';SuperNotCalledException“;关于onDestroy?,java,android,exception,super,Java,Android,Exception,Super,我在片段中使用onDestroy来确保在退出应用程序时停止处理程序(用于设置按钮动画),如下代码所示: @Override public void onDestroy () { if (anim1 !=null && run1 !=null) { anim1.removeCallbacks(run1); } super.onDestroy (); } anim1是处理程序;run1是可运行的 代码在我的测试设备中按预期工作(运行各种And
@Override
public void onDestroy () {
if (anim1 !=null && run1 !=null) {
anim1.removeCallbacks(run1);
}
super.onDestroy ();
}
anim1是处理程序;run1是可运行的
代码在我的测试设备中按预期工作(运行各种Android版本,但不是6.0或8.1-正如您将看到的,这将是一个问题)。从谷歌控制台报告和总体反馈来看,它也适用于绝大多数用户
换句话说,如果用户试图离开应用程序(或移动到另一个片段),而Handler/Runnable仍然存在,则不会引发异常,并且anim1.removeCallbacks(run1)代码>按预期触发,没有错误
然而,从谷歌控制台的报告来看,一些安卓6.0和8.1用户有一个超级NotCalledException(下面提供了日志)。从数字上看,与6.0相比,8.1用户似乎受到的影响更大
我知道问题出在我的onDestroy实现中,因为这个错误(SuperNotCalledException)只有在我实现了上面的代码之后才开始出现在Google控制台上。在我获得NPE之前,因为应用程序退出时处理程序仍在运行(此错误不再存在)
我只收到一些错误报告,所以很明显,它只影响少数用户。但我想知道我做错了什么,以及如何修复它
我已经研究过其他类似的问题,例如:
但它们似乎与我的问题无关。
super.ondestory
在我的代码中,它位于末尾。logcat也不太透露(至少对我来说):
你知道我可以进一步解决这个问题吗?我感到有点困惑,因为实际上是3行代码导致了这个问题,我不知道如何把它们放在一起
如果您需要任何进一步的详细信息或代码,请告诉我,我很乐意提供。我正在添加我的解决方案,以防其他人发现它有用。
事实证明,问题不在这个特定的片段和代码中,而是在另一个类似的片段中
我已经复制/粘贴了所有的代码,但在某个地方,我在搜索时发现的代码是这样的:
@Override
public void onDestroy () {
if (anim1 !=null && run1 !=null) {
anim1.removeCallbacks(run1);
super.onDestroy ();
}
}
由于super.ondestory()
意外地在if语句中结束,因此当anim1
和/或run1
为空时,每当活动被破坏时,都无法访问它。由于logcat没有报告发生异常的片段,所以检测异常并不容易
这个故事的寓意是,始终检查代码的所有实例,即使您已经复制/粘贴了它。我正在添加我的解决方案,以防其他人发现它有用。
事实证明,问题不在这个特定的片段和代码中,而是在另一个类似的片段中
我已经复制/粘贴了所有的代码,但在某个地方,我在搜索时发现的代码是这样的:
@Override
public void onDestroy () {
if (anim1 !=null && run1 !=null) {
anim1.removeCallbacks(run1);
super.onDestroy ();
}
}
由于super.ondestory()
意外地在if语句中结束,因此当anim1
和/或run1
为空时,每当活动被破坏时,都无法访问它。由于logcat没有报告发生异常的片段,所以检测异常并不容易
故事的寓意是,始终检查代码的所有实例,即使您已经复制/粘贴了代码。您是否使用了最新版本的片段支持库实现?AndroidX实现可能会更新,尽管您似乎正在使用支持库。另外,您确定要等到onDestroy()
来清理此问题吗?也许,onDestroyView()
会更好。感谢您提供使用onDestroyView()的提示,我没有想到这一点。我试试看。对我来说,复制/解决这个问题有点困难,因为正如我所说的,它似乎只影响少数用户。您是否正在使用最新版本的支持库片段实现?AndroidX实现可能会更新,尽管您似乎正在使用支持库。另外,您确定要等到onDestroy()
来清理此问题吗?也许,onDestroyView()
会更好。感谢您提供使用onDestroyView()的提示,我没有想到这一点。我试试看。对我来说,复制/解决这个问题有点困难,因为正如我所说的,它似乎只影响少数用户。