美文网首页
自己设计实现图片加载器

自己设计实现图片加载器

作者: SHUTUP | 来源:发表于2017-07-25 16:34 被阅读53次

这里不贴大段的代码了,单单列出思路,和一些解决思路。

我们的图片加载过程,可以引入缓存,我们设计一种两层缓存的架构,当拿到一个需要加载的图片的url时,我们先从内存缓存中根据url查找看内存缓存有没有相关缓存,如果没有,那么我们在磁盘缓存中进行查找,如果磁盘缓存也没有,那么我们需要发出真正的网络请求,进行图片的加载,当图片网络加载成功时将图片存入两级缓存。
内存缓存的实现,可以借助LruCache,大小可以指定为app可用内存的8分之一。
磁盘缓存可以借助DiskLruCache,也可以自己在app的缓存目录下进行文件io,注意由于文件Io比较慢,因此存和取最好都要开启新的异步任务。另外如果自己进行实现,可以考虑对url进行MD5运算,将文件名取为hash值,同时使用app缓存文件时,最好自己在建一个子目录。另外app内部可以有一个菜单展示当前磁盘缓存大小,方便进行清理。
网络请求的实现,最基本的要通过异步任务来获取图片。

加载图片的优化问题。
图片是各式各样的,大多数情况下,我们要展示的图片,比原始图片小很多。比如用户头像控件只有6464,如果用户的头像的原始文件有512512,那么即使我们加载了原始图片,然而肉眼也看不出区别。因此,我们加载图片的时候,可以先获取即将加载的图片的大小,格式等,然后根据需要的尺寸,加载重新采样的版本。这一个过程,对于网络加载同样适用。BitmapFactory的decodeStream可以从网络输入流加载图片。不过如果我们先测量,后加载,可能会爆io异常,这是由于同一个输入流被读取了两次。根据api,第一次测量的时候,输入流的读取位置被改变了,如果需要再次读取,需要先复位。然而我测试发现,即使复位,也有可能报异常,因此参考了网络的其它回答。我们可以将输入流数据写入字节数组输出流中,然后就可以多次对流进行操作了。

网络请求的发出优化
当需要加载大量图片时,可能会有这样的场景,即当前页面的图片还没有加载出来,我们已经滑动到了其它页面,或者下一页,这导致发出的网络请求越来越多,而用户目前正在查看的内容的网络请求无法最快完成。比如在一个展示图片的app中,上拉会加载更多图片。如果在当前页的图片未完全展示的情况下,用户进行了多次上拉操作,那么即使一开始的页面的图片已经没用了,后台的网络请求还是回去先加载它们,从而使得当前用户停留页面的图片得不到即使加载。
我在实现中曾引入一个简单的设计,一个存储异步任务的数组,发出任务时,加入数组,如果超过一定的阈值,那么就取消最先加入的任务,而添加新的任务。

相关文章

  • 自己设计实现图片加载器

    这里不贴大段的代码了,单单列出思路,和一些解决思路。 我们的图片加载过程,可以引入缓存,我们设计一种两层缓存的架构...

  • 3.手写自己的java类加载器

    类的加载过程?何为双亲委派机制?为啥这么设计?实现一个自己的类加载器?如何打破双亲委派机制? 1.类加载器 jar...

  • 图片加载框架

    之前实现了一个选择本地图片进行加载显示的选择器,利用Glide作为图片加载器,Glide是一个十分方便的图片加载库...

  • 6-阿里面试题:Tomcat容器类加载器设计 [线程上下文类加载

    Tomcat这种web容器中的类加载器应该如何设计实现?首先我们来看下Tomcat类加载器的设计结构: 那么应用程...

  • 图片的懒加载和预加载

    懒加载:又称延迟加载,需要等到某个情况下才加载,相对可以缓解服务器压力。 实现原理:以懒加载图片为例,当加载图片较...

  • 图片懒加载

    原理: 按需加载图片,在图片位置滚动到浏览器窗口中时才去加载图片,这样可以减少网络请求提高网页加载速度-实现代码 ...

  • Glide加载图片实现不同大小圆角图片

    当我们用Glide图片加载器加载图片的时候,只要使用Glide 的 apply() 方法就可以实现各种类型的图片。...

  • 类加载器

    类加载过程 类加载器层次结构 使用类加载器作为命名空间 实现自己的类加载器 字节码验证

  • 实现图片延迟加载插件lazyload

    jquery.lazyload是一个实现图片延迟加载的jQuery 插件,它可以延迟加载长页面中的图片。在浏览器可...

  • 图片预加载

    定义:图片预先加载到浏览器中,即先让图片下载到本地,然后在继续执行后续的操作 js实现图片预加载 进度条:h5新标签

网友评论

      本文标题:自己设计实现图片加载器

      本文链接:https://www.haomeiwen.com/subject/tyumkxtx.html