2012-12-24 40 views
0

有一個活動和一些變量。他們從前一個通過。 senerio是: - 當用戶點擊主頁按鈕並返回到主屏幕後,用戶點擊一下應用程序圖標回到應用程序,應用程序崩潰。我認爲這是因爲Android系統殺死了這個活動或其他東西,然後它試圖執行onCreate(),不幸的是有一個NullpointerException,所以該應用程序崩潰。Android:活動將變量保存在內存中

任何想法來解決這個問題或者我應該怎麼做這個例外? 謝謝。

請允許我祝願你在聖誕快樂之前。

+0

發佈您的logcat。 –

+2

@Jxdwinter發佈一些代碼和錯誤logcat,以便我們可以幫助您更多。 –

回答

1

當您按下「home」時,控件將轉到Home應用程序,並將當前應用程序推送到後臺。 Android可能會隨時終止進程以回收內存。

當您返回到活動時,它可能是同一實例(如果Android沒有終止進程),或者它可能是活動的新實例。如果內存是很緊,你從一個活動向前發展

可能發生同樣的事情;活動可以被釋放。當您按下後退時,您可能會遇到同樣的問題。

如果你想保留數據,你應該使用onSaveInstanceState(Bundle)來存儲任何你想恢復的數據。

注意的onCreate()採用包作爲參數。如果活動已暫停(例如按Home時發生),則會調用onSaveInstanceState()以允許臨時存儲數據,並將相同的數據傳回onCreate()。如果該活動正在以新鮮的形式啓動,則該捆綁將爲空。

所以,你應該這樣做:

public void onSaveInstanceState(Bundle bundle) { 
    super.onSaveInstanceState(bundle); 
    // store data in the bundle 
} 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (savedInstanceState != null) { 
     // read old data from the Bundle 
    } else { 
     // you're starting clean; no saved data 
    } 
    ... 
} 

的幾個注意事項:

  • 存儲在捆綁的所有數據必須是原始的,序列化,或更好,Parcelable
  • 數據在Android的具有android:id設置的視圖會自動存儲在捆綁包中,並且在重新創建活動時會回收(例如,在EditText中鍵入的數據將會保存)
  • 其他數據不是的一部分和Android查看不會被自動保存,也不會對數據的自定義視圖

希望這有助於!

+0

我想保存一個實體,但onSaveInstanceState(Bundle bundle)和SharedPreferences只能保存int字符串或布爾值。 – jxdwinter

+0

如果實體是Serializable或Parcelable,則可以將其添加到包中。可序列化在Android上稍慢一些,但如果只有一些對象可以保存,則不會引人注意。嘗試在類定義中添加'implements Serializable'(它在java.io中)。 (注意,從它引用的任何其他對象也必須是可序列化的或指向它們的標記爲瞬態的) –