暂停活动或片段时保存已加载的数据

时间:2015-10-08 08:13:38

标签: android save onpause

我一直在从服务器加载数据并将其呈现在列表视图或网格视图中,但每次暂停活动或将其最小化时,数据都会在我返回上述活动时重新加载。

我知道可以在onSaveInstanceState中保存字符串,整数或布尔值但是有一种方法可以保存其他数据对象,例如对象的ArrayLists,记住一些片段嵌套在其他片段中,这使得使用setRetainInstance(true)不可行?

3 个答案:

答案 0 :(得分:2)

这是一个官方android指南的链接来处理这个问题 http://developer.android.com/guide/topics/resources/runtime-changes.html

基本上你在片段中保存数据(对象的ArrayList),当恢复Activity时,你从片段中检索数据。

片段在活动更改状态之间或运行时更改期间不会被销毁。

这就是你的片段应该是这样的:

public class RetainedFragment extends Fragment {

    // data object we want to retain
    private ArrayList<YourObject> data;

    // this method is only called once for this fragment
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // retain this fragment
        setRetainInstance(true);
    }

    public void setData(ArrayList<YourObject> data) {
        this.data = data;
    }

    public ArrayList<YourObject> getData() {
        return data;
    }
}

你的onDestroy()方法:

@Override
    public void onDestroy() {
        super.onDestroy();
        // store the data in the fragment
        dataFragment.setData(collectMyLoadedData());
    }

你的onCreate()方法应该是相同的唯一区别是你在这一行上加载数据的方式:

dataFragment.setData(loadMyData());

对于嵌套片段问题,请检查此链接http://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en

答案 1 :(得分:2)

简短的回答是肯定的,只要您确保它实现ParcelableSerializable,您就可以将任何内容保存到onSaveInstanceState中。

对于您的情况,更长但可能更好的解决方案是使用LoaderManager回调来从互联网加载您的内容。这将您的数据与活动生命周期分离,使您免于运行时更改所带来的许多痛苦。

答案 2 :(得分:0)

如果要在片段中保存数据,请在片段中调用方法setRetainInstance( ),这样在运行时更改期间不会销毁片段, 您可以通过在活动的onSaveInstanceState回调方法中对其进行分区并写入包来保存自定义对象,并在onCreateOnRestart回调中检索它。 我希望blog post可以帮助您详细了解事情