Android框架之路——Glide加载图片(结合RecyclerView、CardView)

Android框架之路——Glide加载图片

一、简介:

在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。

  • 使用简单
  • 可配置度高,自适应程度高
  • 支持常见图片格式 Jpg png gif webp
  • 支持多种数据源 网络、本地、资源、Assets 等
  • 高效缓存策略 支持Memory和Disk图片缓存 默认Bitmap格式采用RGB_565内存使用至少减少一半
  • 生命周期集成 根据Activity/Fragment生命周期自动管理请求
  • 高效处理Bitmap 使用Bitmap Pool使Bitmap复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力.

然后呢,这篇文章的重点不完全放在了Glide上,重要的是完成了一个demo——RecyclerView+CardView+Glide加载图片实现瀑布流,写过瀑布流的都知道,这中间有个bug,滑动的时候item位置会变动,这效果就很难受了。本文参考了一位前辈的方法,将其移植到我们的demo中来,算是基本解决了这个问题。

二、添加依赖:

去github上查看最新添加依赖:https://github.com/bumptech/glide

repositories {
  mavenCentral() // jcenter() works as well because it pulls from Maven Central
}

dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:19.1.0'
}

如果你需要各种变换效果,你可以继续添加:

compile 'jp.wasabeef:glide-transformations:2.0.1'
compile 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.3.0'   
三、解锁姿势:
  1. 最简单的使用:

    Glide.with(this)
         .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
         .into(imageView);
  2. with()的参数:

    • with(Context context). 使用Application上下文,Glide请求将不受Activity/Fragment生命周期控制。
    • with(Activity activity). 使用Activity作为上下文,Glide的请求会受到Activity生命周期控制。
    • with(FragmentActivity activity). Glide的请求会受到FragmentActivity生命周期控制。
    • with(android.app.Fragment fragment). Glide的请求会受到Fragment 生命周期控制。
    • with(android.support.v4.app.Fragment fragment). Glide的请求会受到Fragment生命周期控制。
  3. load()的使用:
    Glide基本可以load任何可以拿到的媒体资源,load的参数也不局限于String类型。
    可以拿到的资源:

    load()的参数类型:

    • load(Uri uri),
    • load(File file),
    • load(Integer resourceId),
    • load(URL url),
    • load(byte[] model),
    • load(T model),
    • loadFromMediaStore(Uri uri)
  4. 重要功能:
    • .skipMemoryCache(true) 禁止内存缓存
    • .get(context).clearMemory() 清除内存缓存,必须在UI线程中调用
    • .diskCacheStrategy(DiskCacheStrategy.NONE) 禁止磁盘缓存
    • .get(applicationContext).clearDiskCache() 清除磁盘缓存,必须在后台线程中调用,建议同时clearMemory()
    • new GetDiskCacheSizeTask(textView).execute(new File(getCacheDir(),DiskCache.Factory.DEFAULT_DISK_CACHE_DIR)) 获取缓存大小
    • .priority(Priority.HIGH/LOW) 指定资源的优先加载顺序
    • .thumbnail(0.1f) 先显示缩略图,再显示原图
    • 对图片进行裁剪、模糊、滤镜等处理
    • 对请求状态进行监听
    • 对资源的下载进度进行监听
  5. Api方法说明:
    • thumbnail(float sizeMultiplier)——请求给定系数的缩略图。如果缩略图比全尺寸图先加载完,就显示缩略图,否则就不显示。系数sizeMultiplier必须在(0,1)之间,可以递归调用该方法。
    • sizeMultiplier(float sizeMultiplier)——在加载资源之前给Target大小设置系数。
    • diskCacheStrategy(DiskCacheStrategy strategy)——设置缓存策略。默认采用DiskCacheStrategy.RESULT策略,对于download only操作要使用DiskCacheStrategy.SOURCE。
      • DiskCacheStrategy.SOURCE:缓存原始数据,
      • DiskCacheStrategy.RESULT:缓存变换(如缩放、裁剪等)后的资源数据,
      • DiskCacheStrategy.NONE:什么都不缓存,
      • DiskCacheStrategy.ALL:缓存SOURC和RESULT。
    • priority(Priority priority)——指定加载的优先级,优先级越高越优先加载,但不保证所有图片都按序加载。枚举Priority.IMMEDIATE,Priority.HIGH,Priority.NORMAL,Priority.LOW。默认为Priority.NORMAL。
    • dontAnimate()——移除所有的动画。
    • animate(int animationId)——在异步加载资源完成时会执行该动画。
    • animate(ViewPropertyAnimation.Animator animator)——在异步加载资源完成时会执行该动画。
    • placeholder(int resourceId)——设置资源加载过程中的占位Drawable。
    • placeholder(Drawable drawable)——设置资源加载过程中的占位Drawable。
    • fallback(int resourceId)——设置model为空时要显示的Drawable。如果没设置fallback,model为空时将显示error的Drawable,如果error的Drawable也没设置,就显示placeholder的Drawable。
    • fallback(Drawable drawable)——设置model为空时显示的Drawable。
    • error(int resourceId)——设置load失败时显示的Drawable。
    • error(Drawable drawable)——设置load失败时显示的Drawable。
    • listener(RequestListener
四、来个Demo:
  1. 这里我们会用到ButterKnife,不会使用的可以看一下Android框架之路——ButterKnife的使用;
  2. 看一下Demo效果:

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ANR(Application Not Responding)错误通常是由于主线程被长时间阻塞而引起的。在Android,主线程负责处理用户界面交互和渲染,如果主线程被阻塞,应用程序将无法响应用户的操作,从而导致ANR错误。 在使用Glide加载图片时,如果没有正确地配置和使用Glide库,可能会导致主线程被阻塞,从而引起ANR错误。以下是一些可能导致ANR错误的常见问题: 1. 在主线程调用Glide.load()方法。这将导致Glide在主线程加载图片并阻塞主线程。 2. 在Fragment使用ViewPager,并在ViewPager加载大量图片。这将导致ViewPager在滑动过程卡顿,并可能引起ANR错误。 要避免这些问题,你可以尝试以下几种解决方案: 1. 使用Glide的with()方法指定一个非主线程的上下文。 2. 使用Glide的asynchronous()方法将图片加载操作放在单独的线程执行。 3. 在Fragment使用ViewPager时,使用FragmentStatePagerAdapter而不是FragmentPagerAdapter。FragmentStatePagerAdapter只保留当前Fragment和相邻的Fragment的状态,而FragmentPagerAdapter会保留所有的Fragment状态。这将减少在ViewPager加载大量图片时的资源消耗。 4. 使用RecyclerView代替ViewPager,因为RecyclerView可以更好地处理大量数据的情况。同时,使用RecyclerView时,应该使用RecyclerView.Adapter的异步加载图片技术。 希望这些解决方案能帮助你解决ANR问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值