9

我有一个 ListFragment,它将通过 ArrayAdapter 显示项目列表,我正在尝试处理配置更改(设备轮换) 我觉得将活动上下文传递给 Array Adapter 可能会在 Activity 在轮换时重新启动并保留 ListFragment 适配器时导致内存泄漏,因为我正在使用 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);

    }
4

2 回答 2

17

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

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

于 2013-09-19T14:19:12.823 回答
4

根据您使用活动上下文的目的,可以改用应用程序上下文,但在某些情况下您可能仍需要活动上下文。例如,您不能执行 findViewById 或显示带有应用程序上下文的 toast/对话框。

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

以下是对不同上下文类型及其功能的一个很好的总结:http: //www.doubleencore.com/2013/06/context/

于 2013-09-19T14:26:47.727 回答