Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OOM问题 #17

Closed
hero0812 opened this issue Oct 11, 2017 · 32 comments
Closed

OOM问题 #17

hero0812 opened this issue Oct 11, 2017 · 32 comments

Comments

@hero0812
Copy link

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

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

@yangchaojiang
Copy link
Owner

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

@hero0812
Copy link
Author

列表有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();
}

}

@yangchaojiang
Copy link
Owner

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

@hero0812
Copy link
Author

辛苦同学了,向你学习~

@yangchaojiang
Copy link
Owner

版本1.1.1

@yangchaojiang
Copy link
Owner

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

@hero0812
Copy link
Author

439fc524-d771-4d5a-841c-093169ca23bc
gif

@yangchaojiang
Copy link
Owner

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

@hero0812
Copy link
Author

c1300619-bde1-4b79-a127-74994e1c9d86

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

@yangchaojiang
Copy link
Owner

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

@yangchaojiang
Copy link
Owner

欢迎你参与代码改进啦

@yangchaojiang
Copy link
Owner

主要有Fragment的 List

@hero0812
Copy link
Author

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

@yangchaojiang
Copy link
Owner

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

@yangchaojiang
Copy link
Owner

image

@yangchaojiang
Copy link
Owner

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

@yangchaojiang
Copy link
Owner

image
image

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

@hero0812
Copy link
Author

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

@yangchaojiang
Copy link
Owner

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

@hero0812
Copy link
Author

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

@yangchaojiang
Copy link
Owner

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

@hero0812
Copy link
Author

MyGlideModule 这个类还有Manifest中

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

@yangchaojiang
Copy link
Owner

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

@hero0812
Copy link
Author

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

@yangchaojiang
Copy link
Owner

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

@yangchaojiang
Copy link
Owner

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

image
image

@yangchaojiang
Copy link
Owner

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

@hero0812
Copy link
Author

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

@hero0812
Copy link
Author

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

@yangchaojiang
Copy link
Owner

加了。

@luoluoqi0898
Copy link

luoluoqi0898 commented Dec 15, 2017

我才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)

@yangchaojiang
Copy link
Owner

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants