android – Fragment,保存onSaveInstanceState上的大型数据列表(如何防止TransactionTooLargeException)

android – Fragment,保存onSaveInstanceState上的大型数据列表(如何防止TransactionTooLargeException),第1张

概述在我的应用程序中,我在ViewPager中有Fragment.片段包含RecyclerView,其中包含基于用户选择从web api获取的数据列表. 在我的片段onSaveInstanceState上,我将列表数据保存到Bunde,以保持配置更改等数据. public void onSaveInstanceState(Bundle savedState) { super.onSaveIns 在我的应用程序中,我在VIEwPager中有Fragment.片段包含RecyclerVIEw,其中包含基于用户选择从web API获取的数据列表.

在我的片段onSaveInstanceState上,我将列表数据保存到Bunde,以保持配置更改等数据.

public voID onSaveInstanceState(Bundle savedState) {    super.onSaveInstanceState(savedState);    savedState.putParcelableArrayList(List_STORAGE_KEY,new ArrayList<>(mItemAdapter.getModels()));}

现在我已经开始在我的应用程序错误报告上看到TransactionToolargeException.

在某些情况下,似乎我放入Bundle的列表太大(因为它是非常复杂的对象的集合).

我该如何处理这个案子?如何存储(和恢复)我的Fragment状态.

在VIEwPager中的片段上使用setRetainInstance(true)是否可以?

解决方法 为了保留大块数据,Google建议使用保留实例的Fragment.想法是创建没有视图的空片段和所有必需的字段,否则这些字段将被保存在Bundle中.添加setRetainInstance(true);到Fragment的onCreate方法.而不是将数据保存在Activity的onDestroy上的Fragment中并将它们加载到onCreate上.以下是活动的例子:
public class MyActivity extends Activity {private DataFragment dataFragment;@OverrIDepublic voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.main);    // find the retained fragment on activity restarts    FragmentManager fm = getFragmentManager();    dataFragment = (DataFragment) fm.findFragmentByTag("data");    // create the fragment and data the first time    if (dataFragment == null) {        // add the fragment        dataFragment = new DataFragment();        fm.beginTransaction().add(dataFragment,"data").commit();        // load the data from the web        dataFragment.setData(loadMyData());    }    // the data is available in dataFragment.getData()    ...}@OverrIDepublic voID onDestroy() {    super.onDestroy();    // store the data in the fragment    dataFragment.setData(collectMyLoadedData());}}

片段的例子:

public class DataFragment extends Fragment {// data object we want to retainprivate MyDataObject data;// this method is only called once for this fragment@OverrIDepublic voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    // retain this fragment    setRetainInstance(true);}public voID setData(MyDataObject data) {    this.data = data;}public MyDataObject getData() {    return data;}}
总结

以上是内存溢出为你收集整理的android – Fragment,保存onSaveInstanceState上的大型数据列表(如何防止TransactionTooLargeException)全部内容,希望文章能够帮你解决android – Fragment,保存onSaveInstanceState上的大型数据列表(如何防止TransactionTooLargeException)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1138762.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存