RecyclerView如何实现滑动过程中暂停图片加载
前言:在提到Android的性能优化过程中,不得不说到的是列表。在列表中图片处理是尤为关键的一步,如何在列表滑动的过程中暂停图片的加载,使我们的列表在滑动过程中不卡顿,是本篇的研究重点。目前,我们以Android界中几个常用的图片加载框架为例,RecyclerView为载体,来研究一下如何实现。
首先,我们我们需要对RecyclerView添加滑动监听,以便处理不同的表现:
RecyclerView.SCROLL_STATE_IDLE //空闲状态
RecyclerView.SCROLL_STATE_FLING //滚动状态
RecyclerView.SCROLL_STATE_TOUCH_SCROLL //触摸后状态
这里我们只需要判断其是否为空闲状态即可:
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { }else { } } });接下来,就是我们需要去控制图片加载框架,使其暂停加载
1、Glide:
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { Glide.with(mContext).resumeRequests(); }else { Glide.with(mContext).pauseRequests(); } } });
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { Fresco.getImagePipeline().resume(); }else { Fresco.getImagePipeline().pause(); } } });
值得注意的是,在Picasso框架中,我们要指定是哪一个ImageView需要在滑动过程中暂停加载,所以我们需要加一个tag:
⑴ Object tag = new Object();
⑵ Picasso.with(mContext)
.load(url)
.tag(tag)
.into(imageView);
⑶
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { Picasso.with(mContext).resumeTag(tag); }else { Picasso.with(mContext).pauseTag(tag); } } });
当然,这样在代码中动态添加肯定不够方便简洁,如何减少我们的工作量呢,没错,就是自定义View。
我们以Glide框架为例,我们nit的时候,对其添加自己的滑动监听
这里写一个ImageAutoLoadScrollListener,继承自onScrollListener:
那么这样的话,我们整个可以监听滑动状态的自定义RecyclerView就全部写完了,其他两种图片加载框架的处理基本操作相似,这里就不再进行赘述。
祝各位生活愉快