维护Android Activity的数据:onPause,onSaveInstanceState,onRetainNonConfigurationInstance

时间:2011-02-25 22:48:13

标签: java android collections object-persistence

我有一个应用ActivityonCreate使用AsyncTask从服务加载XML文件。 XML被解析为ArrayList。当我切换到另一个活动然后回到主活动时,我希望能够识别出该XML文件已经加载并使用填充的ArrayList

持久ArrayList的最佳方式是什么?

onSaveInstanceState似乎只支持原语,我无法设置实际调用onRetainNonConfigurationInstance的情况。因此,在onCreate中,每次切换到Activity时,都会从服务器加载XML数据。我已经制作了ArrayList工具Parcelable中的模型,所以可以用某种方式使用它吗?

2 个答案:

答案 0 :(得分:3)

  

持久保存ArrayList的最佳方法是什么?

我看不出您的问题与多个活动有什么关系。例如,如果用户按下HOME(喘气!)会发生什么?您的应用最终将被关闭。您想从服务器重新加载数据吗?如果答案是“是”,那么你不需要“坚持”任何东西,onSaveInstanceState()就足够了(见下文)。如果答案是“否”,那么您需要重新考虑数据模型的方法,因此您可以安排将数据保存在数据库中,定期与Web服务同步,并可能转储ArrayList并替换它使用Cursor

  

onSaveInstanceState似乎只支持基元

如果我的HOME问题的回答是“是”,那么您可以保留活动的数据成员中的数据,如果它的大小适中,也可以将其隐藏在BundleonSaveInstanceState()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");
}