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

时间:2013-12-18 22:53:14

标签: android eclipse memory crash

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

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

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

logcat的:

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)

由于我收到NullPointerException,似乎系统删除了变量...... 但当我双击第三行时,eclipse标记了这一行:

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

我无法解释这种行为,因为我在这一行设置了断点,系统在我恢复应用程序时从不调用此表达式。 list是一个ListView。 我怎样才能阻止系统删除变量,然后app暂时不使用?

有人能帮助我吗?

非常感谢!

2 个答案:

答案 0 :(得分:0)

根据我的阅读,系统删除变量应该或多或少地保持不变,因为系统会采取必要措施来保持设备性能。通过在活动的onResume中编写安全检查来重新创建任何丢失的变量,可能有助于避免这些NullPointerExceptions并恢复状态。此外,如果他们持有的数据必须持续很长一段时间,SharedPreferences可能会用于较小的值,而SQLiteDatabase则可用于保存很多内容。

答案 1 :(得分:0)

好的,我有一个解决方案。我将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();

非常感谢!