2013-12-18 76 views
0

當清洗RAM的應用程序崩潰後,我有我的應用程序有問題。我在stackoverflow上搜索了一個解決方案,但我沒有找到一個解決方案。恢復Android應用(空指針異常)

我仍然在開發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,看來,該系統將刪除變量... 但是當我雙擊第三行,蝕痕這一行:

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

我無法解釋這種行爲,因爲我在這一行設置了一個斷點,系統在我恢復應用程序時從未調用過這個表達式。 list是一個ListView。 如何防止系統刪除變量,然後在一段時間內不使用應用程序?

有人可以幫我嗎?

非常感謝!

+1

你在哪裏以及如何初始化'list'?你期望'getChildAt(0)'返回什麼?那可能是空的? – ozbek

+0

getChildAt應該拋出異常。 AdapterViews不能具有傳統意義上的子視圖。看起來這裏有兩個問題。一個包含Activity Lifecycle,另一個包含如何使用adapterview。 –

+0

我在onCreate()中初始化'list'。用'getChildAt(0).getTop()'我想得到第一個可見的項目和它的px是不可見的。當我第一次啓動應用程序時,這很好。當我去菜單並立即恢復時,這也可以正常工作。但是,在恢復之前清理內存時,它不起作用。 – Daniel

回答

0

好,我有一個解決辦法。我將int am_offset = list.getChildAt(0).getTop();替換爲:

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

現在我不再有異常了。

但有人可以給我解釋一下,爲什麼系統會拋出一個異常,altough int am_offset = list.getChildAt(0).getTop();而恢復不會被調用?

非常感謝!

0

單獨從我讀過,系統中刪除變量應該或多或少保留爲系統做的事情一定要保持設備性能。通過在活動的onResume中寫入安全檢查來重新創建任何丟失的變量,可能有助於避免這些NullPointerException和恢復狀態。此外,如果他們持有的數據必須長時間持續,那麼SharedPreferences可能適用於較小的值,而SQLiteDatabase適用於需要節省大量時間。