我的应用程序有问题。我在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();
?
非常感谢!