Android 暂时使用应用程序时OutOfMemory异常

Android 暂时使用应用程序时OutOfMemory异常,android,android-fragments,bitmap,Android,Android Fragments,Bitmap,我有一个复杂的应用程序,它有很多图像、位图和图标 在使用应用程序一段时间后,当我尝试膨胀布局时出现内存不足异常,该异常由位图工厂引发(如预期) 问题是,没有一个页面本身会崩溃,我没有使用非常大的图片,大多数都是使用截击的web请求 以下是场景: 我有一个活动,其中有一个片段,我切换到另一个片段,它有大约15个图像,所有的片段都使用截击实现了BitmapLruCache(我想是正确的),这个片段工作得很好,回到前面的片段也很好。然而,在这两个片段之间来回移动会突然引发OOM异常,我没有将片段保留在

我有一个复杂的应用程序,它有很多图像、位图和图标 在使用应用程序一段时间后,当我尝试膨胀布局时出现内存不足异常,该异常由位图工厂引发(如预期)

问题是,没有一个页面本身会崩溃,我没有使用非常大的图片,大多数都是使用截击的web请求

以下是场景: 我有一个活动,其中有一个片段,我切换到另一个片段,它有大约15个图像,所有的片段都使用截击实现了BitmapLruCache(我想是正确的),这个片段工作得很好,回到前面的片段也很好。然而,在这两个片段之间来回移动会突然引发OOM异常,我没有将片段保留在内存中,我尝试使用片段事务替换和删除片段问题仍然存在


第一个片段有3个静态图片,其他一些是web请求

我搜索了解决方案,但当问题在应用程序的某个点上持续存在时,所有内容都会提供解决方案

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)
处理这个问题的一般方法是什么?当我更改片段时,是否有办法处置/清除缓存或堆?旧的片段根本不需要

我可能会放一些代码,但我不知道从哪里开始

有什么建议吗

编辑:我禁用了截击请求,我的应用程序现在没有网络位图

我就是这样坐着的

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);
}
}
公共类BitmapLruCache扩展LruCache实现ImageLoader.ImageCache{
公共静态int getDefaultLruCacheSize(){
final int maxMemory=(int)(Runtime.getRuntime().maxMemory()/1024);
最终int cacheSize=maxMemory/8;
返回缓存大小;
}
公共BitmapLruCache(){
这个(getDefaultLruCacheSize());
}
公共BitmapLruCache(int-sizeInKiloBytes){
超级(sizeInKiloBytes);
}
@凌驾
受保护的int-sizeOf(字符串键、位图值){
返回值.getRowBytes()*value.getHeight()/1024;
}
@凌驾
公共位图getBitmap(字符串url){
返回get(url);
}
@凌驾
公共位图(字符串url、位图){
put(url、位图);
}
}
编辑2:我在android studio中观察内存图,图中的每个跳跃实际上是片段之间的变化,但正如我前面提到的,如何去除片段?!我以前试过把它拿走

编辑3:以下是其中一个异常的日志(正如我提到的,它并不总是发生在应用程序的同一点上)

12-10 19:44:29.396 29021-29021/com.orderme E/AndroidRuntime:FATAL EXCEPTION:main
进程:com.orderme,PID:29021
java.lang.OutOfMemoryError:无法分配5040012字节的分配,其中3173020个可用字节和3MB字节直到OOM
位于dalvik.system.VMRuntime.newNonMovableArray(本机方法)
在android.graphics.BitmapFactory.NativeDecodeset(本机方法)
位于android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:726)
位于android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:547)
位于android.graphics.drawable.drawable.createFromResourceStream(drawable.java:1014)
位于android.content.res.Resources.loadDrawableForCookie(Resources.java:3747)
位于android.content.res.Resources.loadDrawable(Resources.java:3620)
位于android.content.res.TypedArray.getDrawable(TypedArray.java:762)
在android.widget.ImageView上(ImageView.java:151)
在android.widget.ImageView上。(ImageView.java:140)
位于android.support.v7.widget.AppCompatImageView。(AppCompatImageView.java:60)
位于android.support.v7.widget.AppCompatImageView。(AppCompatImageView.java:56)
位于android.support.v7.internal.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:98)
在android.support.v7.app.AppCompateDelegateImplv7.createView(AppCompateDelegateImplv7.java:926)上
在android.support.v7.app.AppCompateDelegateImplv7.onCreateView(AppCompateDelegateImplv7.java:980)上
位于android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
位于android.view.LayoutInflater$FactoryMerge.onCreateView(LayoutInflater.java:181)
位于android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:732)
位于android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
在android.view.LayoutInflater.inflate(LayoutInflater.java:511)
在android.view.LayoutInflater.充气(LayoutInflater.java:415)
在android.view.LayoutInflater.充气(LayoutInflater