【问题标题】:Maintaining Android Activity's data: onPause, onSaveInstanceState, onRetainNonConfigurationInstance维护 Android Activity 的数据:onPause、onSaveInstanceState、onRetainNonConfigurationInstance
【发布时间】:2011-02-25 22:48:13
【问题描述】:
我有一个应用程序Activity,它在onCreate 中使用AsyncTask 从服务加载XML 文件。 XML 被解析为ArrayList。当我切换到不同的活动,然后回到主活动时,我希望能够识别该 XML 文件已经加载并使用填充的ArrayList。
坚持ArrayList 的最佳方式是什么?
onSaveInstanceState 似乎只支持原语,我无法建立一个实际调用onRetainNonConfigurationInstance 的案例。所以在onCreate 中,每当我切换到Activity 时,都会从服务器加载XML 数据。我已经让ArrayList 中的模型实现了Parcelable,所以可以以某种方式使用它吗?
【问题讨论】:
标签:
java
android
collections
object-persistence
【解决方案1】:
持久化 ArrayList 的最佳方式是什么?
我看不出您的问题与多项活动有什么关系。例如,如果用户按下 HOME(喘气!)会发生什么?您的应用程序最终将被关闭。是否要从服务器重新加载数据?如果答案是“是”,那么您不需要“坚持”任何东西,onSaveInstanceState() 可能就足够了(见下文)。如果答案是“否”,那么您需要重新考虑您的数据模型方法,因此您安排将数据保存在数据库中,定期与您的 Web 服务同步,并可能转储 ArrayList 并将其替换为Cursor.
onSaveInstanceState 似乎只支持原语
如果我的 HOME 问题的答案是“是”,那么您可以只保留您活动的数据成员中的数据,如果它的大小适中,也可以将其存储在 @987654325 中的 Bundle 中@。 Bundle 可以容纳 ArrayList 或 Parcelable。但是,如果数据集很大(比如 100KB 或更多),您可能不想走这条路,应该考虑我上面描述的“否”路径。
我无法设置实际调用 onRetainNonConfigurationInstance 的情况。
旋转屏幕。还有其他情况,但方向变化是最容易触发的。
不过,与你的问题无关。
【解决方案2】:
“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");
}