[英]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.