使用universalimageloader内存溢出怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用universalimageloader内存溢出怎么解决相关的知识,希望对你有一定的参考价值。

使用pagerview+fragment加载图片数据,手机运行内存512M,差不多滑动到25张左右就爆内存溢出
在fragment的onPause方法里面有调用
imageLoader.clearMemoryCache();
imageLoader.clearDiscCache();
System.gc();
根本没效果
universalimageloader的配置为
ImageLoaderConfiguration config = new ImageLoaderConfiguration
.Builder(context)
.threadPoolSize(5)
.discCacheSize(20 * 1024 * 1024)
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.discCacheFileCount(100)
.discCache(new TotalSizeLimitedDiscCache(CacheFile, 20 * 1024 * 1024))
.build();
imageLoader.init(config);

加个爆溢出的logcat
Clamp target GC heap from 256.561MB to 256.000MB
有的机型只有48MB,更容易爆溢出了
参考技术A 我原来也是出现这样的情况
是硬件与硬件或与软件之间的冲突,要想解决
你可以先去网上下载一个电脑故障扫描修复软件
在下载一个windows优化大势和超级兔子最新版
着三种软件会检测你的电脑冲突故障优化系统删除垃圾文件。

使用 universalimageloader 缓存图片的配置类及使用方法

0、gradle 配置

 


dependencies {
compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])
testCompile ‘junit:junit:4.12‘
compile ‘com.android.support:appcompat-v7:25.1.1‘
compile ‘com.squareup.okhttp3:okhttp:3.3.0‘ //okttp依赖
compile ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5‘
}

 

一、配置类

/**
 * @author: qndroid
 * @function: 初始化UniverImageLoader, 并用来加载网络图片
 * @date: 16/6/27
 */
public class ImageLoaderUtil {

    private static final int THREAD_COUNT = 2;
    private static final int PRIORITY = 2;
    private static final int MEMORY_CACHE_SIZE = 2 * 1024 * 1024;
    private static final int DISK_CACHE_SIZE = 50 * 1024 * 1024;
    private static final int CONNECTION_TIME_OUT = 5 * 1000;
    private static final int READ_TIME_OUT = 30 * 1000;

    private static ImageLoaderUtil mInstance = null;
    private static ImageLoader mLoader = null;


    public static ImageLoaderUtil getInstance(Context context) {
        if (mInstance == null) {
            synchronized (ImageLoaderUtil.class) {
                if (mInstance == null) {
                    mInstance = new ImageLoaderUtil(context);
                }
            }
        }
        return mInstance;
    }

    /**
     * 私有构造方法完成初始化工作
     *
     * @param context
     */
    private ImageLoaderUtil(Context context) {

        ImageLoaderConfiguration config = new ImageLoaderConfiguration
                .Builder(context)
                .threadPoolSize(THREAD_COUNT)
                .threadPriority(Thread.NORM_PRIORITY - PRIORITY)
                .denyCacheImageMultipleSizesInMemory()
                //.memoryCache(new UsingFreqLimitedMemoryCache(MEMORY_CACHE_SIZE))
                .memoryCache(new WeakMemoryCache())
                .diskCacheSize(DISK_CACHE_SIZE)
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5 加密
                .tasksProcessingOrder(QueueProcessingType.LIFO)
                .defaultDisplayImageOptions(getDefaultOptions())
                .imageDownloader(new BaseImageDownloader(context, CONNECTION_TIME_OUT, READ_TIME_OUT))
                .writeDebugLogs()
                .build();

        ImageLoader.getInstance().init(config);
        mLoader = ImageLoader.getInstance();
    }

    //load the image
    public void displayImage(ImageView imageView, String path,
                             ImageLoadingListener listener, DisplayImageOptions options) {
        if (mLoader != null) {
            mLoader.displayImage(path, imageView, options, listener);
        }
    }

    //load the image
    public void displayImage(ImageView imageView, String path, ImageLoadingListener listener) {
        if (mLoader != null) {
            mLoader.displayImage(path, imageView, listener);
        }
    }

    public void displayImage(ImageView imageView, String path) {
        displayImage(imageView, path, null);
    }

    /**
     * 默认的图片显示Options,可设置图片的缓存策略,编解码方式等,非常重要
     *
     * @return
     */
    private DisplayImageOptions getDefaultOptions() {
        DisplayImageOptions options = new
                DisplayImageOptions.Builder()
                .cacheInMemory(true)//设置下载的图片是否缓存在内存中, 重要,否则图片不会缓存到内存中
                .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中, 重要,否则图片不会缓存到硬盘中
                .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//设置图片以如何的编码方式显示
                .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//
                .decodingOptions(new BitmapFactory.Options())//设置图片的解码配置
                .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
                .build();
        return options;
    }

    public DisplayImageOptions getOptionsWithNoCache() {

        DisplayImageOptions options = new
                DisplayImageOptions.Builder()
                //.cacheInMemory(true)//设置下载的图片是否缓存在内存中, 重要,否则图片不会缓存到内存中
                //.cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中, 重要,否则图片不会缓存到硬盘中
                .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//设置图片以如何的编码方式显示
                .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//
                .decodingOptions(new BitmapFactory.Options())//设置图片的解码配置
                .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
                .displayer(new FadeInBitmapDisplayer(400))
                .build();
        return options;
    }
}

  

二、使用方法

   // 声明

private ImageLoaderUtil mImageLoader;

//传入 context 实例化
mImageLoader = ImageLoaderUtil.getInstance(mContext);

//显示图片 第一个参数为 imageview 第二个参数为远程的url

mImageLoader.displayImage(mImageViews[i], mHeaderValue.middle.get(i));

以上是关于使用universalimageloader内存溢出怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

UniversalImageLoader的用法总结

Hadoop Mapreduce中shuffle 详解

universalImageLoader,picasso,glide,fresco图片选择库选择分析

翻翻git之---基于universalimageloader实现的图片加载控件BlurImageView

缓冲区下溢异常

SQL注入 移位溢入