暂停 activity 或片段时保存加载的数据

Saving loaded data when pausing an activity or fragment

我一直在从服务器加载数据并将其呈现在列表视图或网格视图中,但每次我暂停 activity 或最小化它时,当我返回到上述 [=15] 时,数据会重新加载=].

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

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

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

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

您的 Fragment 应如下所示:

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());

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

如果您想将数据保存在片段中,请调用片段中的方法setRetainInstance( ),这样您的片段就不会在运行时更改期间被破坏, 您可以通过将自定义对象打包并写入到 activity 的 onSaveInstanceState 回调方法中来保存自定义对象,并在 onCreateOnRestart 回调中检索它。 我希望这个 blog post 可以帮助您详细了解事情

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

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