2012-04-02 36 views
7

在我的應用程序中,我有Loginactivity。它有一個靜態變量用戶名,它將被分配給用戶輸入用戶名的值。登錄活動啓動活動A和A啓動B.在A中,使用變量Loginactivity.username。android應用程序崩潰時的靜態變量行爲

現在由於B中的一些錯誤,應用程序崩潰。當我按下強制關閉時,應用程序重新啓動並且活動A是當前活動。在活動A中,我使用了一個靜態變量Loginactivity.username。我看到在崩潰之後,這個變量的初始值是空的字符串「」;

爲什麼會發生這種情況?你能解釋這種行爲嗎?那麼當應用程序崩潰時,堆棧中的所有活動都會重新啓動?我看到Loginactivity的創建沒有被調用。那麼靜態變量值如何改變?

回答

11

是,當一個應用程序崩潰,重新啓動該應用程序的JVM,你的類將被重新裝載,你失去所有的靜態變量和實例變量。

解決方法是刪除崩潰原因。 :)

+0

我固定的崩潰,但希望知道行爲。謝謝 。 – png 2012-04-02 06:04:28

+3

這是一個很好的問題,但沒有真正提到的Android文檔。 – Snicolas 2012-04-02 06:05:59

+0

如果合適,請接受答案。 – Snicolas 2012-04-02 06:39:15

1

這是因爲您在LoginActivity中保留此靜態成員導致內存泄漏。

我會考慮將此變量保存在應用程序範圍(自定義應用程序類)中或將其保存到數據庫中。

無論如何,只要記住在應用程序完成時取消該變量。

2

使用SharedPreferences代替,或在應用類信息存儲

3

當你的活動B崩潰您的應用程序在運行Android的Dalvik虛擬機(每個應用程序都有其自己的DVM它們是兩個不同的過程)被殺害。當你啓動Activity A時,用戶名是「」,因爲默認情況下,Java爲字符串設置所有實例變量(如果你喜歡的類變量或字段)爲null(引用),0(基元)和「」。所以你的活動A正常工作。你只需要可以存儲用戶名的共享偏好,數據庫,或觸發用戶再次登錄時......我還要修復活動B ...哈哈

+0

我在這裏有一個疑問:如果應用程序重新啓動,它如何獲得以前的活動堆棧。我的應用程序,無論何時在Loginactivity重新啓動,我從sharedpref讀取用戶名。她看到Loginactivity沒有得到恢復,啓動了堆棧頂部的instaed activity A.在A中,我將變量設置爲Loginactivity.username,並且此活動被重置,但活動未恢復! – png 2012-04-02 06:57:28

+0

也許您的共享首選項無法正常工作。你的堆棧被VM殺死了。或者你的邏輯繞過登錄活動有一個小故障。資源? – jjNford 2012-04-02 07:01:31