我有一个应用Activity
,onCreate
使用AsyncTask
从服务加载XML文件。 XML被解析为ArrayList
。当我切换到另一个活动然后回到主活动时,我希望能够识别出该XML文件已经加载并使用填充的ArrayList
。
持久ArrayList
的最佳方式是什么?
onSaveInstanceState
似乎只支持原语,我无法设置实际调用onRetainNonConfigurationInstance
的情况。因此,在onCreate
中,每次切换到Activity
时,都会从服务器加载XML数据。我已经制作了ArrayList
工具Parcelable
中的模型,所以可以用某种方式使用它吗?
答案 0 :(得分:3)
持久保存ArrayList的最佳方法是什么?
我看不出您的问题与多个活动有什么关系。例如,如果用户按下HOME(喘气!)会发生什么?您的应用最终将被关闭。您想从服务器重新加载数据吗?如果答案是“是”,那么你不需要“坚持”任何东西,onSaveInstanceState()
就足够了(见下文)。如果答案是“否”,那么您需要重新考虑数据模型的方法,因此您可以安排将数据保存在数据库中,定期与Web服务同步,并可能转储ArrayList
并替换它使用Cursor
。
onSaveInstanceState似乎只支持基元
如果我的HOME问题的回答是“是”,那么您可以保留活动的数据成员中的数据,如果它的大小适中,也可以将其隐藏在Bundle
中onSaveInstanceState()
。 Bundle
可以保留ArrayList
Parcelable
。但是,如果数据集很大(例如,100KB或更多),您可能不想走这条路线,应该考虑我上面描述的“否”路径。
我无法设置实际调用onRetainNonConfigurationInstance的情况。
旋转屏幕。还有其他方案,但方向更改是触发它的最简单方法。
但是,它与您的问题无关。
答案 1 :(得分:1)
“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");
}