清理后,RAM应用程序崩溃时恢复Android应用程序(NullPointerException)



我的应用程序有问题。我在stackoverflow上搜索了一个解决方案,但没有找到。

我仍然是开发安卓应用程序的初学者。我在上周自己创建了我的第一个应用程序。

问题:当我启动应用程序时,一切正常。同样,当我启动我的应用程序时,转到菜单并立即恢复,但是当我切换到菜单,清理内存然后重新启动我的应用程序时,该应用程序似乎仍在运行,因为它现在崩溃了。当我启动应用程序,切换到其他一些应用程序,然后返回我的应用程序时,我也有类似的效果。在这种情况下,应用程序也会崩溃。那么,为什么应用程序仍在运行,尽管我清理了我的内存?我应该用一些我不知道的基本代码覆盖onFinish()-或onPause()-方法吗?为什么当我一段时间不使用它时,应用程序会崩溃?

日志猫:

12-18 23:19:06.850: E/AndroidRuntime(25262): FATAL EXCEPTION: main
12-18 23:19:06.850: E/AndroidRuntime(25262): java.lang.NullPointerException
12-18 23:19:06.850: E/AndroidRuntime(25262):    at de.dzapps.isoapp.IsoToleranzen.update(IsoToleranzen.java:1293)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at de.dzapps.isoapp.IsoToleranzen$4.onItemClick(IsoToleranzen.java:441)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.widget.AdapterView.performItemClick(AdapterView.java:298)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.widget.AbsListView.performItemClick(AbsListView.java:1283)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at de.dzapps.isoapp.IsoToleranzen$1.onGlobalLayout(IsoToleranzen.java:174)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:682)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1875)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1131)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4611)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.view.Choreographer.doCallbacks(Choreographer.java:555)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.view.Choreographer.doFrame(Choreographer.java:525)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.os.Handler.handleCallback(Handler.java:615)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.os.Looper.loop(Looper.java:137)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at android.app.ActivityThread.main(ActivityThread.java:4898)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at java.lang.reflect.Method.invokeNative(Native Method)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at java.lang.reflect.Method.invoke(Method.java:511)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
12-18 23:19:06.850: E/AndroidRuntime(25262):    at dalvik.system.NativeStart.main(Native Method)

由于我得到了一个空指针异常,似乎系统删除了变量......但是当我双击第三行时,日食标记了这一行:

int am_offset = list.getChildAt(0).getTop();

无法解释这种行为,因为我在此行设置了一个断点,并且在我恢复应用程序时系统从不调用此表达式。 list是一个列表视图。我该如何防止系统删除变量,当应用程序在一段时间内不使用时?

有人可以帮助我吗?

非常感谢!

从我所读到的内容来看,系统删除变量应该或多或少地单独存在,因为系统会做它必须做的事情来保持设备性能。通过在活动的 onResume 中编写安全检查以重新创建任何丢失的变量,这可能有助于避免这些 NullPointerExceptions 并还原状态。此外,如果它们保存的数据必须长时间保留,则 SharedPreferences 可能对小值和 SQLiteDatabase 有一些用处,以便在需要保存大量内容时使用。

好的,

我有一个解决方案。我用以下方式替换了int am_offset = list.getChildAt(0).getTop();

View am_top = list.getChildAt(0);
am_offset = (am_top == null) ? 0 : am_top.getTop();

现在我不再有例外了。

但是有人可以向我解释一下,为什么系统会抛出异常,尽管在恢复时永远不会调用int am_offset = list.getChildAt(0).getTop();

非常感谢!

最新更新