使用setRetainInstance(true)将Context传递给Fragment中的ArrayAdapter会导致泄漏吗?

时间:2013-09-19 14:04:18

标签: android memory-leaks android-fragments android-activity android-arrayadapter

我有一个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);

    }

2 个答案:

答案 0 :(得分:17)

Fragment将被保留(因此不会被垃圾收集)。 Fragment将保留对适配器的引用,并且适配器保存对活动Context的引用,所以是的,我相信这会导致内存泄漏。

一个非常简单的解决方案是将getActivity().getApplicationContext()传递给适配器构造函数。

答案 1 :(得分:4)

根据您使用活动上下文的内容,可能会使用应用程序上下文,但在某些情况下您可能仍需要活动上下文。例如,您不能执行findViewById或显示带有应用程序上下文的Toast / dialog。

如果必须使用活动上下文,那么我会在适配器中添加一个方法来设置上下文,这样你就可以在分离时将它(上下文)设置为null,然后在重新创建片段/活动时再次设置它。

以下是不同上下文类型及其功能的完美摘要: http://www.doubleencore.com/2013/06/context/