Передача контекста ArrayAdapter внутри фрагмента с setRetainInstance (true) вызовет утечку?


У меня есть ListFragment, который будет показывать список элементов через ArrayAdapter, я пытаюсь обработать изменение конфигурации (поворот устройства) я чувствую, что передача контекста активности адаптеру массива может вызвать утечку памяти, когда активность перезапускается при вращении и адаптер 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);

    }
2 9

2 ответа:

Fragment будет сохранен (и, таким образом, не будет собираться мусор). Fragment будет содержать ссылку на адаптер, а адаптер содержит ссылку на действие Context, так что да, я считаю, что это вызовет утечку памяти.

Очень простым решением было бы передать getActivity().getApplicationContext() конструктору адаптера вместо этого.

В зависимости от того, для чего вы используете контекст действия, вместо него можно использовать контекст приложения, но есть некоторые обстоятельства, при которых вам все еще может потребоваться контекст действия. Вы не можете, например, сделать findViewById или отобразить тост / диалог с контекстом приложения.

Если вы должны использовать контекст действия, то я бы добавил метод к вашему адаптеру для установки контекста, чтобы вы могли установить его (контекст) в null при отсоединении, а затем установить его снова, когда ваш фрагмент / действие воссоздается.

Вот хорошее резюме различных типов контекста и их возможностей: http://www.doubleencore.com/2013/06/context/