我的应用有很多RecyclerView
和Fragment
。每次我转到下一个Fragment
,即A到B,A&#39}中的滚动位置和值都会被保存。
我将状态保存为暂停,如:
RecyclerViewAdapter
然后在onCreateView上恢复:
@Override
public void onPause() {
super.onPause();
getArguments().putParcelable(utilities.BUNDLE_RECYCLER_LAYOUT, recyclerView.getLayoutManager().onSaveInstanceState());
}
问题是,当我去B时,A仍然在内存中导致非常大的内存使用量,直到OOM,如果我要去A - B - A - B - A - B等。
问题是:
答案 0 :(得分:0)
RecyclerView负责自动保存状态。你不必对国家做任何事情(在许多情况下)。看看这篇文章 - > http://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en
由于其他原因,您的记忆问题可能存在。片段作为类的实例,在转换后会在内存中保留(通知视图被破坏,并且当片段再次可见时再次创建)。 如果您将项目列表保存为片段的类变量,则当您从A转换为B时,它们将在内存中。
保存内存从OnCreateView方法中的数据源(网络或数据库)检索数据并销毁onDestroyView
中的所有视图(均衡为null)是一个好主意。@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.myfragmentlayout, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
recyclerView = (RecyclerView) view.findViewById(R.id.myrecycler);
recyclerView.setLayoutManager(manager);
myDataSource.retrieveData(new DataCallback(){
public void dataRetrieved(List<Item> items){
//This is working on Main Thread
recyclerView.setAdapter(new MyAdapter(items));
}
});
}
@Override
public void onDestroyView() {
super.onDestroyView();
recyclerView = null;
//with this data is freed and GarbashCollector is able to recover memory when the system needs it
}
正如我所说,recyclerView应该保存其状态而不需要任何额外的代码。但它不适合你,你的代码很好。