zoukankan      html  css  js  c++  java
  • 关于Bitmap内存溢出问题

    在做一个新闻客户端列表的时候遇到了这个问题,加载50条数据左右就内存溢出了.打印看了下100kb的图片变成Bitmap大概有1MB,可想而知这个内存消耗有好大;

    谷歌搜索解决方案,大概方向:

    1,压缩Bitmap

    2,使用软引用(不知道怎么用)

    3,使用磁盘缓存

    最后我选择了使用磁盘缓存,,,,,,,但是,,尼玛什么时候释放内存进行缓存呢???试了几种释放内存的时机,都没有很好的结果,,,最后,找到了一个开源框架,一个只需要导入jar包(没有资源文件所以可以只用导入jar包)的Android框架,太爽了,太好用了!!!

    两句代码解决问题(其中一句只用执行一次)有木有,什么后台图片下载,什么子线程修改UI,什么缓存,什么什么都解决了!

    项目地址:https://github.com/nostra13/Android-Universal-Image-Loader

    下载后找到simple/libs/universal-image-loader-1.8.7-snapshot-with-sources.jar拷贝到你的项目libs下面就行了;

    //初始化环境,可以设置缓存位置等等,这里使用默认的/data/data/package/cache/
    ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(context));
    
    
    //如果你是想加载一张图片,但是不是放到ImageView上面那么你可以这样
    ImageLoader.getInstance().loadImage(uri, listener);
    
    //如果是要放到ImageView上面那你就这样,推荐这样使用
    ImageLoader.getInstance().displayImage(uri, imageView);

    就这么就好了;

    需要注意的是上面那样使用并没有使用缓存,只是保证了内存不会溢出,如果你想使用内存缓存或者磁盘缓存你应该这样:

    //初始化配置信息,这里面可以设置图片尺寸,磁盘缓存位置,线程池大小,内存缓存大小,磁盘缓存大小,磁盘缓存数量等等....
    //这个只需要执行一次,
    ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(this));
    
    //设置图片显示相关细节,这里可以设置:是否使用内存缓存,是否使用磁盘缓存,图片显示方式(滤镜),图片加载中显示什么东西,加载失败显示什么,延迟加载等等...
    public static final DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder().cacheInMemory(true)
                .cacheOnDisc(true).build();
    
    //加载一张图片到ImageView上面
    ImageLoader.getInstance().displayImage(url, imageView,displayImageOptions);

    这个代码写的水平太高了,可定制性非常强!!!

    这里面还带有滤镜什么的,默认的好像有圆角,透明,还有个不知道什么东西;

    更多功能请下载项目观看示例!!!

  • 相关阅读:
    leetcode : 3 sum
    leetcode : Merge two sorted lists
    算法:海量数据问题
    计算机基础:数据库
    计算机基础:Linux
    Java:JVM
    Java:Basic/集合框架/多线程
    Java:面试题
    框架:SSM整合
    LeetCode: Tags-[Bit Manipulation]
  • 原文地址:https://www.cnblogs.com/moqi2013/p/3384518.html
Copyright © 2011-2022 走看看