gpt4 book ai didi

android - fragment ,在onSaveInstanceState上保存大数据列表(如何防止TransactionTooLargeException)

转载 作者:行者123 更新时间:2023-12-04 03:56:43 24 4
gpt4 key购买 nike

在我的应用程序中,我在 ViewPager 中有 Fragment。 Fragment 包含 RecyclerView,其中包含根据用户选择从 web api 获取的数据列表。

在我的 fragment 上 onSaveInstanceState我将列表数据保存到 Bunde,以保留有关配置更改等的数据。

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

现在我开始看到 TransactionTooLargeException在我的应用错误报告上。

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

我该如何处理这种情况?如何存储(和恢复)我的 Fragment 状态。

可以用 setRetainInstance(true)吗在 ViewPager 中的 Fragments 上?

最佳答案

为了保留大量数据,Google 建议使用保留实例的 Fragment。想法是创建没有 View 的空 fragment ,其中包含所有必要的字段,否则将保存在 Bundle 中。 添加 setRetainInstance(true) ;到 Fragment 的 onCreate 方法。而不是在 Activity 的 onDestroy 上将数据保存在 Fragment 中并在 onCreate 上加载它们。这是 Activity 的示例:

public class MyActivity extends Activity {

private DataFragment dataFragment;

@Override
public 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()
...
}

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

fragment 示例:
public class DataFragment extends Fragment {

// data object we want to retain
private MyDataObject 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(MyDataObject data) {
this.data = data;
}

public MyDataObject getData() {
return data;
}
}

关于android - fragment ,在onSaveInstanceState上保存大数据列表(如何防止TransactionTooLargeException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41953195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com