2017-01-27 52 views
2

給出適配器這樣的:在RecyclerView.Adapter中保留Context/Activity實例是否可以泄漏?

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()); 
      }); 
    } 

} 

正如你所看到的,所需要的活動實例推出的意圖。當然,還有其他方法可以做到這一點(例如使用接口),但問題的關鍵在於是否可以安全地在適配器中保留對實例實例的硬引用

回答

3

是的,它的優良背景下的意見

意見不延長語境。 Android的垃圾回收會在對象沒有對它們進行強引用時回收對象。該適配器由RecyclerView引用,RecyclerView在釋放Activity之前將有資格進行垃圾回收,因此在回收Activity時,RecyclerView將有資格進行垃圾回收,因此它不會阻止被垃圾收集的活動。另外,如果Activity具有對Adapter的引用,就好像兩個對象僅具有對彼此的引用,它們不能從根對象訪問並因此都有資格進行垃圾回收。

+0

被選爲最佳答案的好解釋 – BamsBamx

1

我認爲該方法沒有問題,但你並不需要一個Activity實例來調用startActivity,任何Context都可以。你可以通過holder.launchButton.getContext()得到Context的實例。

+0

沒想過View.getContext()好主意 – BamsBamx

1

是的,你可以保留它上下文將繼續存在,直到類實例存在。或者,您可以從任何視圖或返回上下文的全局應用程序類獲取上下文。因此Android提供了方法View.getContext()

相關問題