2016-06-07 146 views
26

我請求從發言者圖像適配器:RecyclerView適配器的生命週期是什麼?

@Override 
    public void onBindViewHolder(SiteAdapter.ViewHolder holder, int position) 
    { 
    Site site = sites.get(position); 
    holder.siteName.setText(site.getName()); 
    requestHolderLogo(holder, site.getLinks().getLogoUrl()); 
    } 

    private void requestHolderLogo(final ViewHolder holder, final String logoUrl) 
    { 
    compositeSubscription.add(
     presenter.bitmap(logoUrl) 
     .subscribe(
      bitmap -> { 
      holder.siteLogo.setImageBitmap(bitmap); 
      holder.siteLogo.setVisibility(View.VISIBLE); 
      }, 
      error -> { 
      holder.siteName.setVisibility(View.VISIBLE); 
      }) 
    ); 
    } 

ViewHolder重新使用我應該取消。這很容易。

但是如何在視圖被銷燬時停止所有訂閱?我也可能抵消主持人蔘考,以避免內存泄露

+8

請解釋爲什麼downvoting –

回答

11

我想做到這一點的最好辦法是:

  1. 保持在SiteAdapter.ViewHolder
  2. unsubscribesubscription對象subscription參考onBindViewHolder(它在ViewHolder被重用時調用)
  3. 保留CompositeSubscription對象在您的adapter
  4. 使用onDetachedFromRecyclerView方法你AdapterunsubscribecompositeSubscription

像這樣的:

public class SiteAdapter extends RecyclerView.Adapter<SiteAdapter.ViewHolder> { 

    private CompositeSubscription compositeSubscription = new CompositeSubscription(); 

    // other needed SiteAdapter methods 

    @Override 
    public void onBindViewHolder(SiteAdapter.ViewHolder holder, int position) { 
     if (holder.subscription != null && !holder.subscription.isUnsubscribed()) { 
      compositeSubscription.remove(holder.subscription); 
      // this will unsubscribe the subscription as well 
     } 
     Site site = sites.get(position); 
     holder.siteName.setText(site.getName()); 
     requestHolderLogo(holder, site.getLinks().getLogoUrl()); 
    } 

    private void requestHolderLogo(final SiteAdapter.ViewHolder holder, final String logoUrl) { 
     holder.subscription = presenter.bitmap(logoUrl) 
       .subscribe(
         bitmap -> { 
          holder.siteLogo.setImageBitmap(bitmap); 
          holder.siteLogo.setVisibility(View.VISIBLE); 
         }, 
         error -> { 
          holder.siteName.setVisibility(View.VISIBLE); 
         }); 
     compositeSubscription.add(holder.subscription); 
    } 

    @Override 
    public void onDetachedFromRecyclerView(RecyclerView recyclerView) { 
     compositeSubscription.unsubscribe(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     public Subscription subscription; 

     // some holder-related stuff 

     public ViewHolder(View itemView) { 
      super(itemView); 
      // init holder 
     } 
    } 
} 
+0

酷,所以在適配器沒有方法時'RecyclerView'被分離被稱爲從活動 –

+0

那麼......實際上有一個 - 'onDetachedFromRecyclerView',它可以很容易地完成'recycle()'目前的工作。好主意:) –

+0

然後讓我更新答案。 :) –