我有一个复杂的应用程序,它有很多图像和位图和图标 在使用应用程序一段时间后,我试图给布局充气时出现内存异常,位图工厂抛出异常(如预期的那样)
事情是没有页面自己崩溃,我没有使用非常大的图片,而且大多数是使用凌空的网页请求
以下是该方案: 我有一个带有片段的活动,我切换到另一个有大约15个图像的片段,所有这些片段都是使用Volley实现的BitmapLruCache(正确的我想),这个片段工作得很好,回到上一个片段工作得很好。然而,在这两个片段之间来回突然提出OOM Exception,我没有将片段保留在内存中,我试图用片段事务替换和删除片段,问题仍然存在
第一个片段有3个静态图片,其他一些是网络请求
我搜索了解决方案,但是当问题在应用程序的某些方面持续存在时,一切都会提出解决方案
处理此问题的一般方法是什么?有没有办法处理/清除缓存或堆,当我更改片段时根本不需要旧片段
我会放一些代码,但我不知道从哪里开始!!
有什么建议吗?
编辑:我停用了排球请求,我的应用现在没有网络位图
这就是我坐起来BitmapLruCache
的方式public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {
public static int getDefaultLruCacheSize() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
return cacheSize;
}
public BitmapLruCache() {
this(getDefaultLruCacheSize());
}
public BitmapLruCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
编辑2:我正在观察android studio中的内存图,图中的每个跳转实际上是片段之间的变化,但正如我之前提到的,我该如何摆脱分段?!我试图在
之前删除它编辑3:这里是其中一个例外的日志(正如我所提到的,它并不总是发生在应用程序的同一点)
12-10 19:44:29.396 29021-29021/com.orderme E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.orderme, PID: 29021
java.lang.OutOfMemoryError: Failed to allocate a 5040012 byte allocation with 3173020 free bytes and 3MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:726)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:547)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1014)
at android.content.res.Resources.loadDrawableForCookie(Resources.java:3747)
at android.content.res.Resources.loadDrawable(Resources.java:3620)
at android.content.res.TypedArray.getDrawable(TypedArray.java:762)
at android.widget.ImageView.<init>(ImageView.java:151)
at android.widget.ImageView.<init>(ImageView.java:140)
at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:60)
at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:56)
at android.support.v7.internal.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:98)
at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:926)
at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:980)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:181)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:732)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
at android.view.LayoutInflater.inflate(LayoutInflater.java:511)
at android.view.LayoutInflater.inflate(LayoutInflater.java:415)
at android.view.LayoutInflater.inflate(LayoutInflater.java:366)
at com.orderme.Main.MainFragment.onCreateView(MainFragment.java:105)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1965)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1078)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1259)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1624)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5951)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
答案 0 :(得分:0)
15张图片并不是什么大问题,假设每张图片的大小均为5mb。验证缓存是否正常工作。当不再需要图像或堆积增长时,很少有图像库不会删除缓存。说毕加索不这样做。我有类似的情况,如果你在朋友列表中向上和向下滚动有OOM。我正在使用毕加索lib。我切换到UIL,我没有再看到OOM。在毕加索我讨厌处理删除缓存虽然它有点忙乱。在UIL,我不需要这样做。
因此,请参阅默认情况下凌空是否不删除缓存,以及您是否已执行此操作。
您可以查看此SO post。
答案 1 :(得分:0)
Problem Solved! After 4 days of trials and heap dumping and everything it turned out it's not in my code
I downgraded zendesk library to an older version it was solved!