yangchaojiang / ZoomPreviewPicture-

拓展性极高类似微信图片和视频浏览,常见应用场景如微信朋友圈照片九宫格和微信聊天图片图片,视频,gif预览

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

OOM问题

hero0812 opened this issue · comments

  GPreviewBuilder.from((Activity) itemView.getContext())
                .setData(thumList)
                .setCurrentIndex(selectPosition)
                .setSingleFling(true)
                .setType(GPreviewBuilder.IndicatorType.Number)
                .start();

当 thumList 中有很多图片url时,左右切换查看图片,app占用内存持续增长不被释放,直到OOM

你的列表有多少,预览退出清除缓存的处理。,你可以回调处理

列表有100个左右,Loader的代码如下:
public class TestImageLoader implements IZoomMediaLoader {

@Override
public void displayImage(@NonNull Fragment context, @NonNull String path, @NonNull final MySimpleTarget<Bitmap> simpleTarget) {
    Glide.with(context)
            .load(path)
            .asBitmap()
            .fitCenter()
            .diskCacheStrategy(DiskCacheStrategy.RESULT)
            .skipMemoryCache(false)
            .error(R.drawable.bbyl_logo)
            .into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                    simpleTarget.onResourceReady(resource);
                }

                @Override
                public void onLoadStarted(Drawable placeholder) {
                    super.onLoadStarted(placeholder);
                    simpleTarget.onLoadStarted();
                }

                @Override
                public void onLoadFailed(Exception e, Drawable errorDrawable) {
                    super.onLoadFailed(e, errorDrawable);
                    simpleTarget.onLoadFailed(errorDrawable);
                }
            });
}

@Override
public void onStop(@NonNull View photoView, @NonNull Fragment context) {
    Glide.with(context).onStop();
}

@Override
public void clearMemory(@NonNull Context c) {
    Glide.get(c).clearMemory();
}

}

好的,考虑在数据多情况下,进行适当释放。尽快新版本

辛苦同学了,向你学习~

版本1.1.1

觉得可以 star 就是最大支持了🤣😊😊😊😊😊

Glide.with(this).load(mUrl).skipMemoryCache(true) ) 使用吧, 你图片够大,看来我的

c1300619-bde1-4b79-a127-74994e1c9d86

你好同学,用了以上是1.1.1版本之后,程序代码和运行的截图。当滑动到80张左右的时候,内存已经占用到了200+,如果Manifest中不开 android:largeHeap="true"的话,程序已经因为OOM崩溃了。我尝试过在源码上做修改,有问题想探讨下:
1、List换为List会不会好一些,这样在ViewPager -- PagerAdapter的destroyItem()方法中就可以做移除和释放bitmap的操作,而不会收到复杂的生命周期的影响

、List换为List会不会好一些???

欢迎你参与代码改进啦

主要有Fragment的 List

啊写错了。。 List ---> List 因为看到另一个图片选择库是这样的。
2、我尝试在IZoomMediaLoader onStop()中拿到photoView并且调用 Glide.clear(View phtotoView)的方法,清理缓存,但是爆出了You must not call setTag() on a view Glide is targeting 错误,看来是因为加载图片时,我们为imageview设置了tag的原因

imageview设置了tag 设置哦 好啦。我找到解决方法 主要viewPager有缓存我的List 滑动的时候,不释放。所以一直增加 加这个 viewPager.setOffscreenPageLimit(4); 就行了。 设置viewPager 缓存模式

你先调试一下,看看有效果么

image
image

小明效果回收, 居然viewPaver 的Fragment 居然坑我了
兄弟 1.1.2

这个肯定不行的,setOffscreenPageLimit()方法默认缓存数是1,小明效果回收是啥意思?

我是内部类的做的, 改成了setOffscreenPageLimit()列表的长度了 你可以试一下

1.1.2版本 虽然不懂内部类的做的和setOffscreenPageLimit()有什么关系,,,退出预览之后,明显看到内存被回收了;但是切换图片时候,内存暴涨问题明显了,
setOffscreenPageLimit(list .size())这么搞,fragment不就更释放不了了吗?
3e4c2d9d-ecb0-4dbd-84c8-1aa7474b012c

setOffscreenPageLimit(3)推荐哦 不要设置哦setOffscreenPageLimit(list .size())。 @hero0812

MyGlideModule 这个类还有Manifest中

不设置的话会有什么问题吗?

MyGlideModule 类 自定义的glide 策略哦 缓存路径设置, 图片缓存显示方式,。没有的化话,默认是策略配置

你那边有用100,200张图片,切换查看,试一试吗?看看会不会有和我这一样的OOM问题,说不定是我本地的代码逻辑问题

这个我这么图片哦。你方便图片链接?我40 50的 不够😢

兄弟哦, 我从第一张滑动91 村内存增加不大哦,看看你项目对glide 配置哦 还有就是
加载图片设置
image

image
image

退出预览只能实在 列表显示图片做的 才有复位的效果。 列表没有显示返回,有一个默认左上的动画

可能是因为单张图片大小和我这不一样的原因。。我用你的demo试了下,就把 ImageUrlConfig 的url 复制几份,424张,切换查看,会涨到190M。。另一个问题是,为什么我的退出预览动画显示不对呢
gif4

我们加个QQ吧,把问题解决方案对应到个 github上来就行了。。这样研究问题好费劲啊1031772600

加了。

我才15张图片就挂了,返回点击退出,任何一张都不会挂,左右滑动就挂了。
求救,搞了一天,没解决。。。

E/PriorityExecutor: Request threw uncaught throwable
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Failed to allocate a 25958412 byte allocation with 4194208 free bytes and 13MB until OOM
at java.util.concurrent.FutureTask.report(FutureTask.java:93)
at java.util.concurrent.FutureTask.get(FutureTask.java:163)
at com.bumptech.glide.load.engine.executor.FifoPriorityThreadPoolExecutor.afterExecute(FifoPriorityThreadPoolExecutor.java:96)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1120)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
at com.bumptech.glide.load.engine.executor.FifoPriorityThreadPoolExecutor$DefaultThreadFactory$1.run(FifoPriorityThreadPoolExecutor.java:118)
Caused by: java.lang.OutOfMemoryError: Failed to allocate a 25958412 byte allocation with 4194208 free bytes and 13MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:686)

请glide加载时 设置缩放处理 本框架本身不对图片不会处理。