- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 fragment 内使用 onDestroy 来确保退出应用程序时停止处理程序(用于为按钮设置动画),如下面的代码所示:
@Override
public void onDestroy () {
if (anim1 !=null && run1 !=null) {
anim1.removeCallbacks(run1);
}
super.onDestroy ();
}
anim1 是 Handler; run1 是可运行的。
代码在我的测试设备中按预期工作(运行各种 Android 版本,但不是 6.0 或 8.1 - 正如您将看到的,这将是一个问题)。从 Google Console 报告和一般反馈来看,它也适用于绝大多数用户。
换句话说,如果用户在 Handler/Runnable 仍然存在的情况下尝试离开应用程序(或移动到另一个 fragment ),则不会引发异常,并且 anim1.removeCallbacks(run1);
会按预期触发,不会出现任何错误。
但是,从 Google Console 的报告来看,一些 Android 6.0 和 8.1 用户遇到了 SuperNotCalledException(下面提供的日志)。从数字上看,8.1 用户似乎比 6.0 受到的影响更大
我知道问题出在我的 onDestroy 实现中,因为此错误 (SuperNotCalledException) 仅在我实现上述代码之后才开始出现在 Google 控制台上。在我收到 NPE 之前,因为应用程序退出时处理程序仍在运行(此错误不再存在)。
我只收到了一些关于此问题的错误报告,因此显然它只影响了少数用户。但我想知道我做错了什么以及如何解决它。
我已经研究过其他类似的问题,例如:
Fatal error: supernotcalledexception
但它们似乎与我的问题无关。super.onDestroy
在我的代码中,它出现在最后。 logcat 也不太透露(至少对我来说):
Huawei Honor 7A (HWDUA-M), Android 8.1
Report 1 of 1
java.lang.RuntimeException:
at android.app.ActivityThread.performDestroyActivity (ActivityThread.java:4679)
at android.app.ActivityThread.handleDestroyActivity (ActivityThread.java:4697)
at android.app.ActivityThread.-wrap5 (Unknown Source)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1837)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loop (Looper.java:166)
at android.app.ActivityThread.main (ActivityThread.java:6861)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:450)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:936)
Caused by: android.support.v4.app.SuperNotCalledException:
at android.support.v4.app.Fragment.performDestroy (Fragment.java:2590)
at android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1566)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManager.java:1759)
at android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1836)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange (FragmentManager.java:3244)
at android.support.v4.app.FragmentManagerImpl.dispatchDestroy (FragmentManager.java:3235)
at android.support.v4.app.FragmentController.dispatchDestroy (FragmentController.java:265)
at android.support.v4.app.FragmentActivity.onDestroy (FragmentActivity.java:390)
at android.support.v7.app.AppCompatActivity.onDestroy (AppCompatActivity.java:209)
at android.app.Activity.performDestroy (Activity.java:7335)
at android.app.Instrumentation.callActivityOnDestroy (Instrumentation.java:1249)
at android.app.ActivityThread.performDestroyActivity (ActivityThread.java:4666)
知道我可以尝试如何进一步解决该问题吗?我感到有点困惑,因为实际上是 3 行代码导致了问题,而且我不知道如何将它们组合在一起。
如果您需要任何进一步的详细信息或代码,请告诉我,我很乐意提供。
最佳答案
我将添加我的解决方案作为答案,以防其他人发现它有用。事实证明,问题不在于这个特定的 fragment 和代码,而在于另一个类似的 fragment 。
我已经将代码复制/粘贴到了所有这些代码中,但是在某个时候,某个地方,我发现搜索的代码是这样的:
@Override
public void onDestroy () {
if (anim1 !=null && run1 !=null) {
anim1.removeCallbacks(run1);
super.onDestroy ();
}
}
由于 super.onDestroy ()
意外地结束在 if 语句内,因此每当 Activity 被销毁而 anim1
和/或 run1
为空时,它就无法访问。 logcat 不报告发生异常的哪个 fragment ,这一事实并没有使检测变得更容易。
这个故事的寓意是,始终检查代码的所有实例,即使您已经复制/粘贴了它。
关于java - 如何修复onDestroy的 'SuperNotCalledException"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56209776/
我创建了一个窗口,并在某个时候调用了 OnDestroy(),而用户从未单击关闭窗口的“关闭”或“X”按钮。 还有哪些其他操作/ Action /事物可能导致调用此函数,为什么? Microsoft
这是我的部分代码: package com.admobsdk_dfp_handler; import com.google.ads.*; import com.google.ads.doublecli
覆盖 Activity 的 ondestroy 时,我应该在 super.onDestroy() 之前或之后放置命令吗? protected void onDestroy() { //opti
我用 onDestroy()方法,我的代码没有完成: @Override public void onDestroy() { super.onDestroy();
我的代码:(用于耳机控制和更改音量) @Override public void onResume() { headSetConn=new HeadSetBCast(); regist
我正在阅读 Activity 生命周期,并阅读有关启动和销毁 Activity 的文档,链接如下: http://developer.android.com/training/basics/activ
我目前正在构建一个 Android 应用程序,它将用作防盗类应用程序。基本上,一旦警报发出,应用程序将监控加速度计以检测运动。如果是,用户将有 15 秒的时间输入设置的密码来停用警报,否则:BIIII
我在检测应用程序何时完成时遇到了一些问题。我需要在 Destroy 上执行一些操作,例如将参数保存到数据库中并最终连接到服务器。 问题是,如果我将代码放在 onDestroy 中,例如,当方向发生变化
我知道在 Android 中,您不会得到有保证的 Activity 的 onDestroy() 调用。我的问题是在哪些情况下不调用 onDestroy()? 最佳答案 假设有两个 Activity A
当我的 Activity 由于内存而被操作系统破坏时(例如,当一个电话打断它时),然后当我的 Activity 试图再次启动时,它不会返回任何预期的回调,除了 onDestroy(),我怎样才能再次恢
我无法理解 onDestroy() 的行为。我的问题是:是否有可能在不杀死 hole 应用程序的情况下不调用 onDestroy() 就杀死一个 Activity ?我的意思是,我会不会回到我的应用程
我希望当我点击手机上的后退按钮时关闭当前 Activity 并返回菜单并停止媒体播放器 但我收到错误消息:不幸的是武器已停止!单击后退按钮 那么如何解决呢? public class pushke e
我开始在我看过的两个视频类(class)中学习 android 开发,我读过的一本书说 onDestroy() 是操作系统在感觉释放内存时调用的。甚至没有人提到它会在用户关闭应用程序时被调用。这让我怀
我已经学会了如何发送推送通知,效果很好,但即使在应用程序关闭后我也需要向用户发送通知。到目前为止,我知道如何在应用程序运行时发送它。在 Android 上,当应用程序处于后台或什至关闭时,您如何发送通
为什么后桶会在父级上调用 onDestroy()? 我有以下场景: Activity A 通过 intent 打开 Activity B Intent intent = new Intent(pare
我试图在我的 OnDestroy () 中调用一个服务,但是日志都不起作用,有人知道为什么吗? @Override protected void onDestroy() { Log.e("on
嗨,这是我的代码,我试图做的是在我触摸开始出现的屏幕可绘制对象后,首先在背景 (touch2) 中出现一张图片。那么问题出在哪里呢? 问题是在我触摸屏幕之前,当我看到 touch2 图像时,如果我按下
每当我的 Activity 被终止时,我都会尝试执行一些代码,但是当它只是简单地移到后台时不会(所以只在 onPause() 中调用它不是解决方案),并且我了解不能保证调用 onDestory()。我
我要打电话 onDestroy() android 中的服务方法。 我已经在互联网上搜索了很多,很多答案都是 if 服务强制停止或以某种方式它的 onDestroy() 永远不会调用。 但我真的需要知
我正在阅读“开始 Android 4 开发”这本书,并且我正在使用按钮中的以下功能控制服务: public void startService(View view) { startServic
我是一名优秀的程序员,十分优秀!