前言在提到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();        }    }});


2、 Fresco

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


3、 Picasso

值得注意的是,在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就全部写完了,其他两种图片加载框架的处理基本操作相似,这里就不再进行赘述。


祝各位生活愉快

更多相关文章

  1. Android(安卓)开发经验(转)
  2. Android资源管理框架(Asset Manager)简要介绍
  3. Android(安卓)studio 使用原生自带DownloadManager实现app下载更
  4. 移动端启动速度
  5. Android(安卓)系统启动流程解析-从开机到Dalvik VM
  6. 抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少8
  7. 在Xamarin.Forms中使用SkiaSharp绘图时从原生工程中加载图片
  8. Android(安卓)通过广播监听USB连接状态的改变
  9. Android学习路线(十一)管理Activity的生命周期

随机推荐

  1. mysql属于关系型数据库吗
  2. mysql数据库是做什么
  3. MySQL语句执行顺序和编写顺序实例解析
  4. linux环境下安装mysql数据库的详细教程
  5. 浅谈MySql 视图、触发器以及存储过程
  6. SQL Server数据库错误5123解决方案
  7. MySql 存储引擎和索引相关知识总结
  8. mysql安装navicat之后,出现2059,Authenti
  9. MySQL 8.0.20 Window10免安装版配置及Nav
  10. 基于sqlalchemy对mysql实现增删改查操作