
普及知识:
android系统的手机在系统底层指定了堆内存的上限值,大部分手机的缺省值是16MB,不过也有些高配置的机型是24MB的,所以我们的程序在申请内 存空间时,为了确保能够成功申请到内存空间,应该保证当前已分配的内存加上当前需要分配的内存值的总大小不能超过当前堆的最大内存值,而且内存管理上将外 部内存完全当成了当前堆的一部分,也就是说Bitmap对象通过栈上的引用来指向堆上的Bitmap对象,而堆上的Bitmap对象又对应了一个使用了外 部存储的native图像,也就是实际上使用的字节数组byte[]来存储的位图信息,因此解码之后的Bitmap的总大小就不能超过8M了。充说明:堆(HEAP)是VM中占用内存最多的部分,通常是动态分配的。堆的大小不是一成不变的,当堆内存实际的利用率偏离设定的值的时候,虚拟机会在 GC的时候调整堆内存大小,让实际占用率向个百分比靠拢。比如初始的HEAP是4M大小,当4M的空间被占用超过75%的时候,重新分配堆为8M大;当 8M被占用超过75%,分配堆为16M大。倒过来,当16M的堆利用不足30%的时候,缩减它的大小为8M大。重新设置堆的大小,尤其是压缩,一般会涉及 到内存的拷贝,所以变更堆的大小对效率有不良影响。
目前我们的问题:
介于目前我们所做的项目都是些移动电子商务客户端类的,难免会从服务端读取大量的图片,这时候如果对图片的加载、存储处理不当,很容易导致内存溢出,所以通过几个项目的总结,下面的加载图片的方式目前还是比较稳定和方便使用的.
解决方案:
通过单线程一张一张的加载图片,并且对图片做缓存处理,对内存中的图片做自动清除,而不用开发人员手动清除,避免清除不及时和清除过早导致的一系列问题
具体的实现:
有yImageCache、yLogicProcess、yNetDownLoad、yPageInfo、yRefresh yTask、yUtils、yLog几个比较重要的类,接下来分别解释一些这几个类的用途
yImageCache:图片缓冲类,主要是用来存储整个应用当中用到的所有图片,存储方式是把图片分为两份,一份软引用,一份正常引用,对正常引用的图片数量设置一个最大值,当达到这个峰值的时候就需要把它转成软引用,方便系统回收
yLogicProcess:下载图片的逻辑,每个页面需要调用 yLogicProcess里面的一些方法下载图片,这样做的目的是把一些相关的逻辑抽象出来,让开发人员不用过多的关注具体的下载过程,只需要传入相应的参数即可
yNetDownLoad:具体的下载类,里面有一个线程在跑,不停在检测是不是有新的任务,如果有就去执行
yPageInfo:存放页面的一些信息,包括一些页面ID
yRefresh:刷新接口,每个页面都要继承它
yTask:任务类:存放任务信息,每下载一张图片,都是个任务
yUtils:工具类
yLog:日志类,可以控制停止打印
demo详解:
本demo是Vjia客户端首页焦点图的下载,通过本实例讲解了上面解决方案的具体应用,其中com.yek.lx.frame这个包里面的类是我抽出来的,并且基本上和业务不相关的,也就说任何一个项目只需要把它们拷贝过去就可以。说到这里大家肯定很想知道,我是怎么刷新页面的,大家看MainActivity这个类的一个方法:
//刷新界面
public void refresh(Object... param) {
if(hgAdapter!=null){
hgAdapter.notifyDataSetChanged();
}
}
对,就在这个方法里完成,这也就是为什么我们要实现刷新接口了
那接下来我们怎么调用下载图片的方法呢,大家看这里:
// 下载网络图片
logicProcess.setImageView((BaseActivity) context, imageView,itemList.get(position % itemList.size()).imageurl, R.drawable.icon);
用起来很简单吧!
