使用Universal-Image-Loader(UIL) 还是出现OOM 问题,跪求大牛

origin_code 2015-05-25 11:38:49
首先我的UIL 配置是
public static void initImageLoader(Context context) {
File cacheDir = StorageUtils.getOwnCacheDirectory(context, "imageloader/Cache");

ImageLoaderConfiguration configuration = new ImageLoaderConfiguration
.Builder(context)
.memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长宽 // default = device screen dimensions
.threadPoolSize(3) //线程池内加载数量
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
//.memoryCache(new UsingFreqLimitedMemoryCache(14 * 1024 * 1024)) //You can pass your own memory cache implementation /你可以通过自己的内存缓存实现
.memoryCache(new WeakMemoryCache())
.memoryCacheSize(2 * 1024 * 1024)
.diskCacheSize(80 * 1024 * 1024)
.discCacheFileNameGenerator(new Md5FileNameGenerator()) //将保存的时候的URI名称用MD5 加密
.tasksProcessingOrder(QueueProcessingType.LIFO)
.discCacheFileCount(100) //缓存的文件数量
.diskCache(new UnlimitedDiskCache(cacheDir)) //自定义缓存路劲
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000)) //connectTimeout( 5s ), readTimeout ( 30 ) 超时时间
.writeDebugLogs() //Remove for release app
.build(); //开始构建

ImageLoader.getInstance().init(configuration);
}


(2) 我的图片配置文件
public class DisplayImageOptionSetting {

public static DisplayImageOptions options;

public static DisplayImageOptions optionsCacheInDisc(){
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.video_default) //设置图片在下载期间显示的图片
.showImageForEmptyUri(R.drawable.image_background_empty) //设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.image_background_erro) //设置图片加载/解码过程中错误时候显示的图片
.cacheInMemory(false) //设置下载的图片是否缓存在内存中
.cacheOnDisk(true) //设置下载的图片是否缓存在SD卡中
.considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT) //设置图片以如何的编码方式显示
.bitmapConfig(Bitmap.Config.RGB_565) //设置图片的解码类型//
//.decodingOptions(android.graphics.BitmapFactory.Options decodingOptions) //设置图片的解码配置
.delayBeforeLoading(0) //int delayInMillis为你设置的下载前的延迟时间
.resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
.displayer(new FadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间
.build();//构建完成

return options;
}
}


最后就是引用了:
public Holder setImageBuilderUIL(int viewId,String url,ImageLoader imageLoader,DisplayImageOptions options) {

ImageView view = getView(viewId);
imageLoader.displayImage(url,view,options);
return this;
}


结果是回报OOM 问题,内存推从16MB 直接升至96MB 最后就提示OOM,然后随便点一个加载图片的页面就会报OOM问题,求大牛帮忙
...全文
2419 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
会撸码的雅痞 2015-12-24
  • 打赏
  • 举报
回复
查看这个,希望对你有帮助 http://blog.csdn.net/editor1994/article/details/50394560
Q花千骨 2015-11-27
  • 打赏
  • 举报
回复
我也出现了相同问题,改动了所有设置,结果发现 .resetViewBeforeLoading(false) 这样设置后发现会好很多,暂时不清楚什么原因,有空再研究下,先解决临时问题
开发者_android 2015-05-25
  • 打赏
  • 举报
回复
这个好像不是ImageLoader抛出的。

那个networkhandler是自定义的吗?看看。。
origin_code 2015-05-25
  • 打赏
  • 举报
回复
origin_code 2015-05-25
  • 打赏
  • 举报
回复
上传一下 我的错误日志:跪求大牛啊
origin_code 2015-05-25
  • 打赏
  • 举报
回复
哎,真难 2015-05-25
  • 打赏
  • 举报
回复
要设置内存大小,
sirnuo 2015-05-25
  • 打赏
  • 举报
回复
你多加一些日志; 打印 setImageBuilderUIL 方法调用了多少次,创建了多少View
origin_code 2015-05-25
  • 打赏
  • 举报
回复
引用 13 楼 sirnuo 的回复:
你同时创建了多少个 Holder ? setImageBuilderUIL 是不是调用很频繁? 有可能是你界面设计的问题,同时创建了太多ImageView
Holdrer只有一个,是在horlistView 里面展示10张图片 ,
sirnuo 2015-05-25
  • 打赏
  • 举报
回复
你同时创建了多少个 Holder ? setImageBuilderUIL 是不是调用很频繁? 有可能是你界面设计的问题,同时创建了太多ImageView
origin_code 2015-05-25
  • 打赏
  • 举报
回复
引用 10 楼 zdd2389 的回复:
[quote=引用 8 楼 zqs62761130 的回复:] [quote=引用 6 楼 zdd2389 的回复:] 加载到96MB ,如果点击新的页面,内存没有先降后升,说明存在内存泄露。是不是之前的那个页面有什么引用没有删除掉,不然UIL是会自动回收内存的。我之前碰到一种情况是将整个activity压入hashmap中,结果finish的时候忘记从hashmap中删除,导致存在对activity的引用,内存就一直回收不了了。
恩,我也是这么觉得的,UIL 应该有自动回收机制的,但是问题就是 我的activity ,finish()之后,内存确实没有回收,但是我也不知道那里引用了。 我的程序里面有个acitivityManager 专门做activity栈的,是不是也需要弹出,在释放?[/quote] 看来你碰到的情况跟我一样,我也是有个acitivityManager 专门做activity栈的,忘了弹出。半年以后我才发现的这个bug。[/quote] 同命相连啊。。我能不能加你一下,看看我的问题好么,刚才我做弹出操作了,可惜还是不会OOM, QQ:121082015
qq_22703909 2015-05-25
  • 打赏
  • 举报
回复
这个是nethander 是Picasso框架的报错,是以前的图片框架,现在改成了UIL,现在没用Picasso了。 我的问题在于 设置缓存 不在内存里
zdd2389 2015-05-25
  • 打赏
  • 举报
回复
引用 8 楼 zqs62761130 的回复:
[quote=引用 6 楼 zdd2389 的回复:] 加载到96MB ,如果点击新的页面,内存没有先降后升,说明存在内存泄露。是不是之前的那个页面有什么引用没有删除掉,不然UIL是会自动回收内存的。我之前碰到一种情况是将整个activity压入hashmap中,结果finish的时候忘记从hashmap中删除,导致存在对activity的引用,内存就一直回收不了了。
恩,我也是这么觉得的,UIL 应该有自动回收机制的,但是问题就是 我的activity ,finish()之后,内存确实没有回收,但是我也不知道那里引用了。 我的程序里面有个acitivityManager 专门做activity栈的,是不是也需要弹出,在释放?[/quote] 看来你碰到的情况跟我一样,我也是有个acitivityManager 专门做activity栈的,忘了弹出。半年以后我才发现的这个bug。
origin_code 2015-05-25
  • 打赏
  • 举报
回复
引用 7 楼 dalor 的回复:
[quote=引用 5 楼 zqs62761130 的回复:] [quote=引用 4 楼 dalor 的回复:] 这个好像不是ImageLoader抛出的。 那个networkhandler是自定义的吗?看看。。
这个是nethander 是Picasso框架的报错,是以前的图片框架,现在改成了UIL,现在没用Picasso了。 我的问题在于 设置缓存 不在内存里,.memoryCache(new WeakMemoryCache()) 就是不知道如何释放图片内存[/quote] 你已经设置.memoryCache(new WeakMemoryCache()),这本身就是减少内存的设置。使用框架后,对内存的操作封装在框架内。没办法对它进行手释放的。你可以再优化一下设置吧,毕竟,uil只是减少了OOM,不是消灭了oom。 [/quote] 如果 我finish()装有我很多图片的activity,UIL是不是可以自动给我回收啊,我的内存爆表了,我释放了acitivity,但是没有回收我的资源
origin_code 2015-05-25
  • 打赏
  • 举报
回复
引用 6 楼 zdd2389 的回复:
加载到96MB ,如果点击新的页面,内存没有先降后升,说明存在内存泄露。是不是之前的那个页面有什么引用没有删除掉,不然UIL是会自动回收内存的。我之前碰到一种情况是将整个activity压入hashmap中,结果finish的时候忘记从hashmap中删除,导致存在对activity的引用,内存就一直回收不了了。
恩,我也是这么觉得的,UIL 应该有自动回收机制的,但是问题就是 我的activity ,finish()之后,内存确实没有回收,但是我也不知道那里引用了。 我的程序里面有个acitivityManager 专门做activity栈的,是不是也需要弹出,在释放?
开发者_android 2015-05-25
  • 打赏
  • 举报
回复
引用 5 楼 zqs62761130 的回复:
[quote=引用 4 楼 dalor 的回复:] 这个好像不是ImageLoader抛出的。 那个networkhandler是自定义的吗?看看。。
这个是nethander 是Picasso框架的报错,是以前的图片框架,现在改成了UIL,现在没用Picasso了。 我的问题在于 设置缓存 不在内存里,.memoryCache(new WeakMemoryCache()) 就是不知道如何释放图片内存[/quote] 你已经设置.memoryCache(new WeakMemoryCache()),这本身就是减少内存的设置。使用框架后,对内存的操作封装在框架内。没办法对它进行手释放的。你可以再优化一下设置吧,毕竟,uil只是减少了OOM,不是消灭了oom。
zdd2389 2015-05-25
  • 打赏
  • 举报
回复
加载到96MB ,如果点击新的页面,内存没有先降后升,说明存在内存泄露。是不是之前的那个页面有什么引用没有删除掉,不然UIL是会自动回收内存的。我之前碰到一种情况是将整个activity压入hashmap中,结果finish的时候忘记从hashmap中删除,导致存在对activity的引用,内存就一直回收不了了。
origin_code 2015-05-25
  • 打赏
  • 举报
回复
引用 4 楼 dalor 的回复:
这个好像不是ImageLoader抛出的。 那个networkhandler是自定义的吗?看看。。
这个是nethander 是Picasso框架的报错,是以前的图片框架,现在改成了UIL,现在没用Picasso了。 我的问题在于 设置缓存 不在内存里,.memoryCache(new WeakMemoryCache()) 就是不知道如何释放图片内存

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧