2017-01-27 4 views
2

Учитывая адаптер, как это:Безопасна ли утечка для сохранения экземпляра контекста/действия в RecyclerView.Adapter?

public class MyAdapter extends RecyclerView.Adapter { 

    private final Activity mActivity; 
    private final List<Item> mItemList; 

    public MyAdapter(Activity activity, List<Item> itemList) { 
     this.mActivity = activity; 
     this.mItemList = itemList; 
    } 

    //[...] 

    public void onBindViewHolder(ViewHolder holder, int position) { 
     final Item i = mItemList.get(position); 
     holder.launchButton.setOnClickListener(new OnClickListener() { 
       @Override public void onClick(View v) { 
        mActivity.startActivity(i.getIntent()); 
      }); 
    } 

} 

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

ответ

3

Да, это нормально. Коллекция мусора Android будет перерабатывать объекты, если нет сильной ссылки на них из корневого объекта. Адаптер ссылается на RecyclerView, и RecyclerView будет иметь право на сбор мусора до того, как Activity будет освобожден, поэтому к тому времени, когда Activity будет переработана, RecyclerView будет иметь право на сбор мусора и, таким образом, это не будет препятствовать Активность от сбора мусора. Кроме того, это нормально, если в Activity есть ссылка на Адаптер, как если бы у двух объектов были только ссылки друг на друга, они не могут получить доступ к корневому объекту и, следовательно, оба имеют право на сбор мусора.

+0

Выбранный как лучший ответ для хорошего объяснения – BamsBamx

1

Я не вижу проблемы с этим подходом, но вам действительно не нужен экземпляр Activity для звонка startActivity, любой Context будет делать. И вы можете получить экземпляр Context через holder.launchButton.getContext().

+0

Не думал о View.getContext() хорошая идея – BamsBamx

1

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

просмотров не продлевают контекст так Android обеспечивает контекст для соображений по методе View.getContext()

 Смежные вопросы

  • Нет связанных вопросов^_^