2011-01-14 131 views
0

我看到一種奇怪的情況。Android:在對話框中關閉活動

我讀從數據庫的一些信息,然後將彈出一個對話框: 僞

val = DBaseManager.readValue(i,POS_ONE); 

if(val == 1) 
{ 
    Dialog_Test myDialog = new 
    Dialog_Test (myContext,"",new addListener(),DBaseManager); 
    myDialog.show(); 
} 

,你可以看到我傳遞到對話框中DBaseManager所以它也可以使用它。

然後在那裏我用這樣的:

DBaseManager.readValue(k,POS_TWO); 

現在這個工程的99%的時間,但是我有一些指向這些行對話框,在崩潰日誌空指針異常。

對我來說,這表明在某些設備上,我的onPause或OnDestory方法在主要活動中被調用,該活動會關閉並消除DBaseManager。這些是1.6,2.2和2.3的設備。

所以問題是爲什麼,以及如何預防?我已經添加了一些空指針檢查來防止崩潰,但它仍然很不理想。

UPDATE:在我的設備上,至少當我做一個屏幕旋轉活動重新啓動,對話框消失 - 它可能會在一些對話框上保持?

回答

0

這可能取決於您的對話框的範圍以及您打開它的代碼的位置。除非您明確處理方向更改並覆蓋onOrientationChanged,否則默認行爲是在方向更改時,活動會經歷其生命週期。你可能想要做一些事情,比如在Activity級別維護對話的狀態(比如添加一個布爾isDialogDisplayed作爲類變量),然後在onCreate或onResume中檢查並重新打開對話框。

至於清理DBaseManager對象,我遇到過類似的事情。當你不指望它們的時候,大的對象被清理乾淨(仍然有指向這些對象的指針,但它們已被系統以某種方式清空)。我在我的應用程序中確定了這些內容,並且更加小心。當只有當你的代碼可能已經清空了變量(或者使用延遲加載)時,而不是null檢查和重新加載時,我總是把這個對象當作懶惰加載。添加一個返回此對象而不是直接訪問它的方法,並且始終檢查是否爲null,如果是,則重新加載。

對於這兩個問題,您可能希望覆蓋此活動的所有生命週期方法並記錄它們。不要忘記在覆蓋範圍內調用基類的生命週期方法(例如,public void onPause() { super.onPause() ...等)!

+0

謝謝,我認爲這是清理大物體的第二種情況。我已經覆蓋了所有內容,但無法重現它只發生在現場。我想我會創建一個util例程,按照建議重新打開它。 – Chris 2011-01-14 16:21:27