[英]Maintaining Android Activity's data: onPause, onSaveInstanceState, onRetainNonConfigurationInstance
我有一個應用程序Activity
,在onCreate
使用AsyncTask
從服務加載XML文件。 XML被解析為ArrayList
。 當我切換到不同的活動然后回到主活動時,我希望能夠識別出已經加載了該XML文件並使用填充的ArrayList
。
保持ArrayList
的最佳方法是什么?
onSaveInstanceState
似乎只支持原語,我一直無法設置onRetainNonConfigurationInstance
實際被調用的情況。 因此,在onCreate
,只要我切換到Activity
就會從服務器加載XML數據。 我已經使ArrayList
的模型實現了Parcelable
,所以可以用某種方式使用它嗎?
保持ArrayList的最佳方法是什么?
我沒有看到你的問題與多個活動有什么關系。 例如,如果用戶按下HOME(喘氣!)會發生什么? 您的應用最終將被關閉。 您想從服務器重新加載數據嗎? 如果答案是“是”,那么你不需要“持久”任何東西,並且onSaveInstanceState()
可能就足夠了(見下文)。 如果答案是“否”,那么您需要重新考慮數據模型的方法,因此您可以安排將數據保存在數據庫中,定期與Web服務同步,並可能轉儲ArrayList
並將其替換為Cursor
。
onSaveInstanceState似乎只支持原語
如果我的HOME問題的答案是“是”,那么你可以只保留活動的數據成員中的數據,如果它的大小適中,也可以將它存放在onSaveInstanceState()
中的Bundle
中。 Bundle
可以包含Parcelable
的ArrayList
。 但是,如果數據集很大(例如,100KB或更多),您可能不想走這條路線,應該考慮我上面描述的“否”路徑。
我一直無法設置一個實際調用onRetainNonConfigurationInstance的情況。
旋轉屏幕。 還有其他方案,但方向更改是觸發它的最簡單方法。
但是,它與您的問題無關。
“onSaveInstanceState似乎只支持原語”
onSaveInstanceState支持對象,只要它們被聲明為可序列化即可。
// ON_SAVE_INSTANCE_STATE
// save instance data (5) on soft kill such as user changing phone orientation
protected void onSaveInstanceState(Bundle outState){
password= editTextPassword.getText().toString();
try {
ConfuseTextStateBuilder b= ConfuseTextState.getBuilder();
b.setIsShowCharCount(isShowCharCount);
b.setTimeExpire(timeExpire);
b.setTimeoutType(timeoutType);
b.setIsValidKey(isValidKey);
b.setPassword(password);
state= b.build(); // may throw
}
catch(InvalidParameterException e){
Log.d(TAG,"FailedToSaveState",e); // will be stripped out of runtime
}
outState.putSerializable("jalcomputing.confusetext.ConfuseTextState", state); // save non view state
super.onSaveInstanceState(outState); // save view state
//Log.d(TAG,"onSaveInstance");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.