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

前端之家收集整理的这篇文章主要介绍了android – Fragment,保存onSaveInstanceState上的大型数据列表(如何防止TransactionTooLargeException)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的应用程序中,我在ViewPager中有Fragment.片段包含RecyclerView,其中包含基于用户选择从web api获取的数据列表.

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

  1. public void onSaveInstanceState(Bundle savedState) {
  2. super.onSaveInstanceState(savedState);
  3. savedState.putParcelableArrayList(LIST_STORAGE_KEY,new ArrayList<>(mItemAdapter.getModels()));
  4. }

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

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

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

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

解决方法

为了保留大块数据,Google建议使用保留实例的Fragment.想法是创建没有视图的空片段和所有必需的字段,否则这些字段将被保存在Bundle中.添加setRetainInstance(true);到Fragment的onCreate方法.而不是将数据保存在Activity的onDestroy上的Fragment中并将它们加载到onCreate上.以下是活动的例子:
  1. public class MyActivity extends Activity {
  2.  
  3. private DataFragment dataFragment;
  4.  
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9.  
  10. // find the retained fragment on activity restarts
  11. FragmentManager fm = getFragmentManager();
  12. dataFragment = (DataFragment) fm.findFragmentByTag("data");
  13.  
  14. // create the fragment and data the first time
  15. if (dataFragment == null) {
  16. // add the fragment
  17. dataFragment = new DataFragment();
  18. fm.beginTransaction().add(dataFragment,"data").commit();
  19. // load the data from the web
  20. dataFragment.setData(loadMyData());
  21. }
  22.  
  23. // the data is available in dataFragment.getData()
  24. ...
  25. }
  26.  
  27. @Override
  28. public void onDestroy() {
  29. super.onDestroy();
  30. // store the data in the fragment
  31. dataFragment.setData(collectMyLoadedData());
  32. }
  33. }

片段的例子:

  1. public class DataFragment extends Fragment {
  2.  
  3. // data object we want to retain
  4. private MyDataObject data;
  5.  
  6. // this method is only called once for this fragment
  7. @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. // retain this fragment
  11. setRetainInstance(true);
  12. }
  13.  
  14. public void setData(MyDataObject data) {
  15. this.data = data;
  16. }
  17.  
  18. public MyDataObject getData() {
  19. return data;
  20. }
  21. }

猜你在找的Android相关文章