【问题标题】:My first Android app crashes when rotated我的第一个 Android 应用程序在旋转时崩溃
【发布时间】:2016-12-15 13:57:10
【问题描述】:

每当我将 Nexus 从纵向旋转到横向或从横向旋转到纵向时,我的应用程序都会崩溃。它会生成下面的异常报告,我不明白。

我基本上按照它说的做了,找到了我的主要活动onDestroy函数并添加了super.onDestroy,这让问题消失了。

但是,为什么会发生这种情况?为什么 onDestroy 会因为我旋转平板电脑而发挥作用?

02-18 00:43:28.504  28259-28259/com.mpr.myfirstapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.mpr.myfirstapp, PID: 28259
android.util.SuperNotCalledException: Activity {com.mpr.myfirstapp/com.mpr.myfirstapp.MainActivity} did not call through to super.onDestroy()
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3660)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3689)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3889)
at android.app.ActivityThread.access$900(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5223)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

【问题讨论】:

  • 在您的 onDestroy() 方法中添加 super.onDestroy()
  • 活动在设备旋转时被销毁并重新创建;阅读活动生命周期。确保在任何时候重写 Activity 类中的方法时,始终调用超级方法。

标签: android


【解决方案1】:

打开您的AndroidManifest.xml 并将此属性添加到您的活动中:

<activity android:name=".YourActivityName" android:configChanges="orientation|screenSize|keyboardHidden" />

当您旋转屏幕而不添加orientation 值时,可能会重新创建活动。

【讨论】:

  • 这适用于我正在开发的应用程序。之前的开发人员在 onDestroy() 方法中有 super.onDestroy(),但是当我在使用 findById() 访问 TexttView 的 Java 文件中添加了一些变量和方法后,当我在特定活动上旋转时,应用程序仍然崩溃。这是一个真正的救星。谢谢。
  • 说真的,这为我解决了?为什么?
【解决方案2】:

这个问题的答案可以在这里找到:

http://developer.android.com/guide/topics/resources/runtime-changes.html

您所遇到的本质上是 Android 活动的默认行为。当方向发生变化时,与 Activity 绑定的资源会发生变化,需要进行管理。这类情况通常使用onSaveInsatanceState()onRestoreInstanceState() 方法处理,文档中重点介绍了它们的用法。

【讨论】:

    【解决方案3】:

    Activity 在旋转之前被销毁。然后以新的方向再次创建它。

    派生类必须调用超类的实现 这种方法。否则,将引发异常。

    这是一个实现细节。完全是documented

    protected void onDestroy ()

    在 API 级别 1 中添加 在活动开始之前执行任何最终清理 被摧毁。这可能是因为活动正在结束 (有人叫finish()就可以了,或者因为系统暂时 销毁该活动实例以节省空间。你可以 用 isFinishing() 方法区分这两种情况。

    注意:不要指望这个方法被调用作为保存的地方 数据!例如,如果活动正在编辑内容中的数据 提供者,这些编辑应该在 onPause() 或 onSaveInstanceState(Bundle),不在这里。这种方法通常 实现释放资源,如与 活动,以便被破坏的活动不会留下这样的东西 在其应用程序的其余部分仍在运行时。有 系统将简单地终止活动托管的情况 处理而不在其中调用此方法(或任何其他方法),因此它 不应该被用来做打算留在身边的事情 进程结束后。

    派生类必须调用超类的实现 这种方法。否则,将引发异常。

    【讨论】:

      【解决方案4】:

      通过查看您的日志,我假设您的 onDestroy() 方法如下所示,

      @Override
      protected void onDestroy() {
      }
      

      实际上你忘记在onDestroy() 方法中调用super.onDestroy();,所以实际上你的onDestroy() 方法应该如下所示,

      @Override
      protected void onDestroy() {
          super.onDestroy();               // Add this line
      }
      

      这应该可以解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多