我有一个ListFragment,它会通过ArrayAdapter显示项目列表,我正在尝试处理配置更改(设备轮换)我觉得将活动上下文传递给Array Adapter可能会导致在旋转和ListFragment适配器上重新启动Activity时出现内存泄漏保留,因为我使用setRetainInstance(true),有人可以告诉我,如果我的理解是真的吗?如果是这样,处理这个问题的最佳方法是什么。是的,我不想在我的适配器onDetach上取消它,并在重新创建片段视图后重复使用它。
public class DummyXListFragment extends RoboSherlockListFragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (adapter == null)
adapter = new DummyItemAdapter(getActivity(),
android.R.layout.simple_list_item_1, list);
}
答案 0 :(得分:17)
Fragment
将被保留(因此不会被垃圾收集)。 Fragment
将保留对适配器的引用,并且适配器保存对活动Context
的引用,所以是的,我相信这会导致内存泄漏。
一个非常简单的解决方案是将getActivity().getApplicationContext()
传递给适配器构造函数。
答案 1 :(得分:4)
根据您使用活动上下文的内容,可能会使用应用程序上下文,但在某些情况下您可能仍需要活动上下文。例如,您不能执行findViewById或显示带有应用程序上下文的Toast / dialog。
如果必须使用活动上下文,那么我会在适配器中添加一个方法来设置上下文,这样你就可以在分离时将它(上下文)设置为null,然后在重新创建片段/活动时再次设置它。
以下是不同上下文类型及其功能的完美摘要: http://www.doubleencore.com/2013/06/context/