2010-08-13 81 views
3

在我接到電話或創建電話(和其他未記錄的中斷)後,我的應用程序在恢復活動時收到NullPointerException。任何人都可以向我解釋它在哪裏和/或如何解決它?當我的活動繼續時,它正在調用創建它看起來,它試圖執行恢復後爲null的東西。我如何防止調用onCreate()?接到電話後應用程序崩潰

當我按下通話按鈕時,我的活動似乎終止,因爲當我嘗試調試此錯誤時,調試器斷開連接。

編輯:

那麼,如何處理 進程被終止 - >的onCreate()?我有活動A - > B - > C - > D,並且我一直按回A,沒有任何問題。但是如果我啓動另一個程序,或者另一個程序來到前臺,D崩潰,那麼C崩潰,然後B崩潰,然後A崩潰!

編輯:

我解決了B,C,D碰撞。這是因爲我存儲靜態變量的類被銷燬以釋放資源,並且我的活動獲得了空變量。

但是當我回到A,我得到一個ClassCastException:

08-13 16:52:10.456: ERROR/AndroidRuntime(6048): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bookcessed.booksearch/com.bookcessed.booksearch.activities.ChooseProviderActivity}: java.lang.ClassCastException: android.view.AbsSavedState$1 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.os.Looper.loop(Looper.java:123) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at dalvik.system.NativeStart.main(Native Method) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048): Caused by: java.lang.ClassCastException: android.view.AbsSavedState$1 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.widget.ProgressBar.onRestoreInstanceState(ProgressBar.java:944) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.view.View.dispatchRestoreInstanceState(View.java:6138) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1209) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1209) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.view.View.restoreHierarchyState(View.java:6117) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1466) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.app.Activity.onRestoreInstanceState(Activity.java:843) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.app.Activity.performRestoreInstanceState(Activity.java:815) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1096) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2641) 
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):  ... 11 more 

這裏是我的onCreate():

super.onCreate(savedInstanceState); 
     tempLayout = new RelativeLayout(ChooseProviderActivity.this); 
     ProgressBar tempProgress = new ProgressBar(ChooseProviderActivity.this); 
     tempProgress.setIndeterminate(true); 
     tempProgress.setId(1); //I suspect this is the problem 
     RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
     lp.addRule(RelativeLayout.CENTER_IN_PARENT); 
     tempLayout.addView(tempProgress, lp); 
     setContentView(tempLayout); 

這是我認爲問題在於:

tempProgress.setId(1); //I suspect this is the problem 
+2

如果有人打電話給你的手機,但這是錯誤的號碼? – recursive 2010-08-13 17:53:33

+0

你可以顯示你的onCreate代碼,以及空指針的確切堆棧跟蹤嗎? – 2010-08-13 18:07:23

+0

@recursive哈哈是啊,他們已經很生氣了,因爲它是。 – 2010-08-13 18:15:08

回答

1

只是爲了其他人的澄清,你並不需要分配的ID給你實例化視圖在代碼中。所以,你的代碼應該只用

ProgressBar tempProgress = new ProgressBar(ChooseProviderActivity.this); 
tempProgress.setIndeterminate(true); 
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
lp.addRule(RelativeLayout.CENTER_IN_PARENT); 
tempLayout.addView(tempProgress, lp); 
setContentView(tempLayout); 

ID是唯一的,主要設置在XML文件中標識的工作時,你爲它分配一個字符串ID,然後R.java編譯,並指定每個資源的ID數。不完全正確!看編輯!

編輯

由於superjos在評論所指出的,你需要的ID相對佈局工作時。當你需要ID時,查看RelativeLayout.LayoutParams.addRule(int,int)上的文檔。

編輯完

就像這個...

LinearLayout ll = new LinearLayout(SomeClass.this); 
ll.setOrientation(VERTICAL); 
TextView tv = new TextView(SomeClass.this); 
EditText et = new EditText(SomeClass.this); 
ll.add(tv); 
ll.add(et); 

這將有一個EditText視圖上面一個TextView。在其他情況下... 做

ll.add(et); 
ll.add(tv); 

將會把以上的EditText TextView的。身份證與他們在屏幕上的佈局完全沒有任何關係。

+0

我想你必須使用它,如果你想指定應如何鋪設對象互相排斥 – 2010-08-14 08:06:41

+2

不,它們的佈局方式取決於您在視圖上設置的LayoutParameters以及何時將其添加到視圖組。我用一些示例代碼編輯我的答案... – DavidAndroidDev 2010-08-16 13:00:50

+0

好吧,實際上,如果您使用相對佈局,那麼您可能最終會使用某個ID,因爲某些視圖需要引用其他某個視圖來定位它。 – superjos 2011-09-04 00:58:13

2

看看這個圖片,看看操作系統將如何以及何時調用您的應用程序。 alt text

+0

那麼,我該如何處理 進程死亡 - > onCreate()? – 2010-08-13 18:12:26

+0

這可能有所幫助:http://stackoverflow.com/questions/151777/how-do-i-save-an-android-applications-state – Asahi 2010-08-13 18:37:17

0

爲什麼不嘗試並覆蓋活動生命週期中使用的所有基本功能?使用adb logcat和log.v來找出發生錯誤的地方。在應用程序崩潰的函數中的每行之後放置一個日誌。

你還打來什麼?你是從一個模擬器呼叫另一個模擬器嗎?我在這種情況下存在的log cat沒有問題。

1

您的應用因某種原因被終止,這就是爲什麼要調用onCreate的原因。您應該保存/恢復應用程序狀態,以便能夠正確處理此問題。看看thisdevelopers reference

1

也許你的應用程序使用太多的內存,所以Android操作系統殺死它以獲得足夠的內存來運行其他活動。

0

我正在使用一個帶有靜態變量的類,並調用.getStoredStaticVariable().saveStoredStaticVariable(),當我嘗試檢索它時,它將爲空,可能是因爲該類正在被銷燬以釋放資源。

編輯:這只是部分解決方案。到ClassCastException()溶液改變

tempProgress.setId(1); 

了一些不太可能被系統使用:

tempProgress.setId(6346346); 
1

您可以再試一次,不要在應用程序加載時參加呼叫或任何流程。等待它設置。