2017-01-27 6 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()