中所做的所有圖像請求,和往常一樣,我們使用適配器來填充listView。在適配器中,我們使用picasso來加載圖像。我發現,當將圖像加載到目標(imageView)時,行被循環使用,畢加索將自動取消該目標的請求。picasso:如何取消在適配器
如何在離開片段或活動時取消所有未完成的請求?
中所做的所有圖像請求,和往常一樣,我們使用適配器來填充listView。在適配器中,我們使用picasso來加載圖像。我發現,當將圖像加載到目標(imageView)時,行被循環使用,畢加索將自動取消該目標的請求。picasso:如何取消在適配器
如何在離開片段或活動時取消所有未完成的請求?
但只有當您不在列表/網格適配器中!爲相同的圖像/目標(例如,在適配器getView中)請求圖像 將自動執行 。如果您提出請求,然後離開 屏幕,則只需取消(並且您不需要實際需要 )。
這個答案可能來的有點晚,但也許有人仍然需要它...
定義一個ViewHolder
它提供了一個清除方法:
static class ImageHolder extends RecyclerView.ViewHolder {
public final ImageView image;
public ImageHolder(final View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.image);
}
public void cleanup() {
Picasso.with(image.getContext())
.cancelRequest(image);
image.setImageDrawable(null);
}
}
實現onViewRecycled()
在您的適配器中:
static class ImageAdapter extends RecyclerView.Adapter<ImageHolder> {
// ...
@Override
public void onViewRecycled(final ImageHolder holder) {
holder.cleanup();
}
}
取消畢加索請求時,你的碎片的觀點被銷燬(或當你想):
public class MyFragment extends Fragment {
private RecyclerView recycler;
// ...
@Override
public void onDestroyView() {
super.onDestroyView();
recycler.setAdapter(null); // will trigger the recycling in the adapter
}
}
RecyclerView.setAdapter(null)
將脫離目前所有加入View
S和其相關的ViewHolder
旨意被回收。
您也可以使用RequestCreator#tag(Object)
來處理您的片段/活動提出的請求,然後使用Picasso#cancelTag(Object)
取消所有這些請求。
我不認爲我明確表示了這個問題。我*不擔心取消正在回收的行的請求,因爲滾動屏幕。我明白,畢加索處理。我的問題是如何在離開擁有適配器的片段或活動時取消所有請求。 – terry