Android 开发艺术探索笔记(22),h5移动端开发工具

  • ScheduleThreadPool

通过newScheduleThreadPool创建,它的核心线程数是固定的,而非核心线程数没有限制,并且当非核心线程闲置时,会被立刻回收。这个线程池主要用于执行定时任务和具有固定时间周期的重复任务。

  • SingleThreadPool

通过newSingleThreadPoolExecutor创建。它只有一个核心线程,它确保所有的任务都在一个行程中按顺序执行。它的意义在于同于所有外界任务到一个线程中,这使得这些任务之间不用处理线程同步的问题。

线程池的用法:

这里写图片描述

Bitmap和加载Chache


因为Android对单个应用所施加的内存限制如16mb,所以我们想办法高速加载Bitmap。

实际开发中经常用到Bitmap做缓存。比较常用的缓存策略有LruChache和DiskLruChache。

前者常被用做内存缓存,后者则是存储缓存。Lru是Least Recently Used的缩写,即最近最少使用算法,它的核心思想为:当缓存快满时,会淘汰近期最少使用的缓存目标。

Bitmap的高效加载

如何加载一个Bitmap呢,BitmapFactory提供了四个方法:decodeFile、decodeResource、decodeStream、decodeByteArray,分别用于从文件系统、资源、输入流以及字节数组中加载处一个Bitmap对象。都是Android底层实现的,对应着BitmapFactory的几个native方法。

**高效加载Bitmap核心思想就是使用Bitmap.Options方法加载所需尺寸的图片。**因为一般ImageView的尺寸都没有图片大,所以把图片整个加载进来就显得很拖沓,所以先把图片按照一定的采样率缩小,然后加载给ImageView。这会一定程度避免程序OOM,提高了加载性能。

通过Options来缩放图片,主要用到的是inSampleSize参数,即采样率。当其大于1,比如为2时,图片宽高取1/2,像素变为原来的1/4,内存也变为1/4,比如一个1024*1024像素采用ARGB8888存储格式的图片来说,其大小为1024*1024*4=4mb,缩小后大小为1mb。所以采样率的缩放比例为1/(inSampleSize^2),比如采样率为4,则缩放比例就是1/16。一般这个数自定位2的指数。

获取采样率的步骤:

(1)将BitmapFactory.Options的inJustDecodeBounds参数设置为true并加载图片

(2)从BitmapFactory.Options中取出图片的原始宽高信息,它们对应于outWidth和outHeight参数。

(3)根据采样率的规则并结合目标View的大小计算inSampleSize

(4)将BitmapFactory.Options的inJustDecodeBounds参数设置为false,然后重新加载图片。

经过上述四个步骤,加载出来的是缩放后的图片。inJustDecodeBounds设置为True时,BitmapFactory只会去解析图片的原始宽/高而不会加载它,所以这个操作时轻量级的。所以有如下代码:

这里写图片描述

这里写图片描述

通过上述的代码,我们使用就简便了,比如一个ImageView的大小为100*100,使用为:

这里写图片描述

除了用decodeResource还可以用其他三个方法来解析加载图片。

Android中的缓存策略

可以用LruChache和DiskLruChache结合实现一个优秀的ImageLoader。

LruChache

LruChache是一个缓存类、泛型类,它内部采用了一个LinkedHashMap以强引用的方式存储外界的缓存对象,其提供了get和put方法来完成缓存的获取和添加操作,当缓存满时,LruChache会移除较早使用的缓存对象,然后添加新的缓存对象。下面要弄清楚强引用、弱引用、软引用

- 强引用

直接的对象应用。

- 软引用

当一个对象只有软引用存在时,系统内存不足时,此对象会被gc回收。

- 弱引用

当一个对象只有弱引用存在时,此对象随时会被gc回收。

另外LruChache线程是安全的。下面为LruChache的初始化:

这里写图片描述

上面代码中,只需提供缓存的总容量大小并重写sizeOf即可。sizeOf的作用是计算缓存对象的大小,单位和总容量一致。上例中,总容量大小为当前进程可用内存的1/8,单位为KB,而siezOf则完成了Bitmap对象大小的计算,除1024也是将单位转化为KB,特殊情况下还要重写entryRemoved方法,在这个方法中做一些资源的回收工作。

通过get、put、remove可以得到、添加、删除一个缓存对象。

LruChacha其实已经是Android源码的一部分了。

DiskLruChache

DiskLruChache作用是实现存储设备缓存,即磁盘存储,它通过将缓存对象写入文件系统从而实现缓存效果。

DiskLruChache并不能通过构造方法来创建,而是通过open来创建自身。

![这里写图片描述](https://img-blog.csdn.net/201808021

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

浏览器打开:qq.cn.hn/FTe 免费领取

82101648?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Jpa2thdGhld29ybGQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

第一个参数为磁盘缓存在文件系统中的存储路径,可以选择sd卡的缓存目录,第二个为应用的版本号,第三个为单个节点对应的数据的个数,一般设为1,第四个表示缓存总大小,当缓存超出这个大小后,会清楚一些缓存。

DiskLruChache的缓存添加

DiskLruChache的缓存添加操作是通过Editor完成的,Editor表示一个缓存对象的编辑对象。实例中,我们首先获取图片的Url所对应的key,然后根据key就可以通过edit()来获得Editor的对象,如果这个缓存正在被编辑则返回null,因为DiskLruChache不允许同时编辑一个缓存对象。之所以要把url转化为key是因为url中可能有特殊字符。一般用url的md5值作为key。

这里写图片描述

将图片的url转为key之后就可以获取Editor对象了,对于这个key来说如果当前不存在其他的Editor则edit()返回一个新的Editor对象,通过它可以得到一个文件输出流。open中因为设置了一个节点只能有一个数据,则下面的DISK_CHACHE_INDEX设为0就可以了

这里写图片描述

有了这个文件输出流,从网上下载这个图片就可以通过这个输出流写入到文件系统上。实现如下:

这里写图片描述

经过上面的步骤,还必须通过Editor.commit()来提交写入操作。如果写入出现异常,则可以用abort()来退回整个操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发教程及笔记-完整版.pdf》是一本关于Android开发的教程和笔记的完整版电子书。这本电子书主要介绍了Android开发所需的各种知识和技术,对于想要学习Android开发的人来说是一本非常有价值的资料。 这本电子书包含了Android开发的基础知识,如Android系统的介绍、Android开发环境的搭建以及常用开发工具的使用方法。同时,它也详细介绍了Android应用程序的开发流程,包括界面设计、布局管理、事件处理、数据库操作等方面的内容,使读者能够全面掌握Android应用程序的开发技巧。 此外,这本电子书还介绍了一些高级的Android开发技术,如网络编程、多媒体处理、传感器应用等方面的知识。通过学习这些高级技术,读者可以进一步提升自己的Android开发水平,设计出更加优秀和复杂的Android应用程序。 除了知识点的介绍之外,这本电子书还提供了大量的实例和代码,让读者能够通过实践来巩固所学知识。同时,它还给出了一些常见问题的解决方法和开发经验的分享,帮助读者更好地理解和应用所学的知识。 总之,《Android开发教程及笔记-完整版.pdf》是一本非常实用的Android开发学习资料,其全面而详细的内容将帮助读者系统地学习和掌握Android开发的技能,为实际项目的开发提供了很好的指导。无论是初学者还是有一定经验的开发者,都可以从中受益匪浅。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值