android如何避免这种内存不足错误

标签 android out-of-memory drawable

我有很多图像说 500ish 分布在 20 个左右的 fragment 中,图像都非常小而且加载都很好,但是我让用户可以选择 3 种不同的图像,现在如果用户更改图像时出现 OOM 错误,所以我认为这是我处理图像的方式,我认为我需要先回收旧图像,但我对如何做到这一点没有信心,有人能帮忙吗?

这是我如何填充我的适配器我只是添加了两个项目来简化事情

    private void prepareCardData(){

    CardWriter cardWriter = new CardWriter(getResources().getDrawable(R.drawable.dog),"DOG","dog ");
    cardMakerList.add(cardWriter);

    cardWriter = new CardWriter(getResources().getDrawable(R.drawable.cat_ic),"CAT","cat ");
    cardMakerList.add(cardWriter);

    cardAdapter.notifyDataSetChanged();
}

这就是我真正等待共享偏好更改并调用方法的地方

private SharedPreferences.OnSharedPreferenceChangeListener listener = new     
SharedPreferences.OnSharedPreferenceChangeListener() {
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if(key.equals("ICONS SELECTED")){
            cardsChoice.setIcons(getActivity());
            cardsToSet();
            System.out.println("OneFrag pref listener");
        }
    }
};
public void cardsToSet(){
    if (cardsChoice.bool_fragTwo == false) {
        if (cardsChoice.group == 1) {
            cardMakerList.clear();
            prepareCardData();
            cardsChoice.bool_fragTwo = true;
        }
        if (cardsChoice.group == 2) {
            cardMakerList.clear();
            prepareSimpleCardData();
            cardsChoice.bool_fragTwo = true;
        }
        if (cardsChoice.group == 3) {
            cardMakerList.clear();
            preparePhotoCardData();
            cardsChoice.bool_fragTwo = true;
        }
    }
}

如前所述,我认为我需要在它自己的线程中运行它并清理和不再需要的图像,但我认为还有更多其他人可以提供帮助?

这里是堆栈跟踪

06-12 17:39:47.878 13189-13219/ss.sealstudios.com.socialstories E/Surface: getSlotFromBufferLocked: unknown buffer: 0x8a12fe70
06-12 17:39:47.985 13189-13189/ss.sealstudios.com.socialstories I/System.out: OneFrag pref listener
06-12 17:39:47.987 13189-13189/ss.sealstudios.com.socialstories I/System.out: OneFrag pref listener
06-12 17:39:48.233 13189-13199/ss.sealstudios.com.socialstories I/art: Clamp target GC heap from 265MB to 256MB
06-12 17:39:48.380 13189-13189/ss.sealstudios.com.socialstories I/System.out: OneFrag pref listener
06-12 17:39:48.410 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.410 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.416 13189-13189/ss.sealstudios.com.socialstories I/art: Alloc sticky concurrent mark sweep GC freed 108(4KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 254MB/256MB, paused 303us total 5.710ms
06-12 17:39:48.417 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.433 13189-13189/ss.sealstudios.com.socialstories I/art: Clamp target GC heap from 283MB to 256MB
06-12 17:39:48.433 13189-13189/ss.sealstudios.com.socialstories I/art: Alloc partial concurrent mark sweep GC freed 5841(393KB) AllocSpace objects, 2(3MB) LOS objects, 1% free, 251MB/256MB, paused 793us total 15.361ms
06-12 17:39:48.493 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.494 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.502 13189-13189/ss.sealstudios.com.socialstories I/art: Alloc sticky concurrent mark sweep GC freed 17(688B) AllocSpace objects, 0(0B) LOS objects, 0% free, 255MB/256MB, paused 545us total 7.748ms
06-12 17:39:48.503 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.526 13189-13189/ss.sealstudios.com.socialstories I/art: Clamp target GC heap from 287MB to 256MB
06-12 17:39:48.526 13189-13189/ss.sealstudios.com.socialstories I/art: Alloc partial concurrent mark sweep GC freed 23(944B) AllocSpace objects, 0(0B) LOS objects, 0% free, 255MB/256MB, paused 494us total 22.482ms
06-12 17:39:48.527 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.567 13189-13189/ss.sealstudios.com.socialstories I/art: Clamp target GC heap from 287MB to 256MB
06-12 17:39:48.567 13189-13189/ss.sealstudios.com.socialstories I/art: Alloc concurrent mark sweep GC freed 9(12KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 255MB/256MB, paused 499us total 38.887ms
06-12 17:39:48.568 13189-13189/ss.sealstudios.com.socialstories I/art: Forcing collection of SoftReferences for 2025KB allocation
06-12 17:39:48.568 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.597 13189-13189/ss.sealstudios.com.socialstories I/art: Clamp target GC heap from 287MB to 256MB
06-12 17:39:48.597 13189-13189/ss.sealstudios.com.socialstories I/art: Alloc concurrent mark sweep GC freed 11(344B) AllocSpace objects, 0(0B) LOS objects, 0% free, 255MB/256MB, paused 501us total 28.481ms
06-12 17:39:48.601 13189-13189/ss.sealstudios.com.socialstories W/art: Throwing OutOfMemoryError "Failed to allocate a 2073612 byte allocation with 559872 free bytes and 546KB until OOM"
06-12 17:39:48.603 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.603 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.610 13189-13189/ss.sealstudios.com.socialstories I/art: Alloc sticky concurrent mark sweep GC freed 3(448B) AllocSpace objects, 0(0B) LOS objects, 0% free, 255MB/256MB, paused 484us total 6.214ms
06-12 17:39:48.611 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.643 13189-13189/ss.sealstudios.com.socialstories I/art: Clamp target GC heap from 287MB to 256MB
06-12 17:39:48.643 13189-13189/ss.sealstudios.com.socialstories I/art: Alloc partial concurrent mark sweep GC freed 6(192B) AllocSpace objects, 0(0B) LOS objects, 0% free, 255MB/256MB, paused 1.131ms total 31.104ms
06-12 17:39:48.644 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.673 13189-13189/ss.sealstudios.com.socialstories I/art: Clamp target GC heap from 287MB to 256MB
06-12 17:39:48.673 13189-13189/ss.sealstudios.com.socialstories I/art: Alloc concurrent mark sweep GC freed 3(96B) AllocSpace objects, 0(0B) LOS objects, 0% free, 255MB/256MB, paused 631us total 29.306ms
06-12 17:39:48.674 13189-13189/ss.sealstudios.com.socialstories I/art: Forcing collection of SoftReferences for 2025KB allocation
06-12 17:39:48.674 13189-13189/ss.sealstudios.com.socialstories I/art: Starting a blocking GC Alloc
06-12 17:39:48.704 13189-13189/ss.sealstudios.com.socialstories I/art: Clamp target GC heap from 287MB to 256MB
06-12 17:39:48.704 13189-13189/ss.sealstudios.com.socialstories I/art: Alloc concurrent mark sweep GC freed 3(96B) AllocSpace objects, 0(0B) LOS objects, 0% free, 255MB/256MB, paused 306us total 29.616ms
06-12 17:39:48.705 13189-13189/ss.sealstudios.com.socialstories W/art: Throwing OutOfMemoryError "Failed to allocate a 2073612 byte allocation with 559872 free bytes and 546KB until OOM"
06-12 17:39:48.709 13189-13189/ss.sealstudios.com.socialstories D/skia: --- allocation failed for scaled bitmap
06-12 17:39:48.709 13189-13189/ss.sealstudios.com.socialstories D/AndroidRuntime: Shutting down VM
06-12 17:39:48.724 13189-13189/ss.sealstudios.com.socialstories E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                  Process: ss.sealstudios.com.socialstories, PID: 13189
                                                                                  java.lang.OutOfMemoryError: Failed to allocate a 2073612 byte allocation with 559872 free bytes and 546KB until OOM
                                                                                      at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                                                                      at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                                                                                      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
                                                                                      at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
                                                                                      at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080)
                                                                                      at android.content.res.Resources.loadDrawableForCookie(Resources.java:2738)
                                                                                      at android.content.res.Resources.loadDrawable(Resources.java:2643)
                                                                                      at android.content.res.Resources.getDrawable(Resources.java:833)
                                                                                      at android.content.res.Resources.getDrawable(Resources.java:786)
                                                                                      at ss.sealstudios.com.socialstories.TwoFragment.prepareCardData(TwoFragment.java:280)
                                                                                      at ss.sealstudios.com.socialstories.TwoFragment.cardsToSet(TwoFragment.java:245)
                                                                                      at ss.sealstudios.com.socialstories.TwoFragment$2.onSharedPreferenceChanged(TwoFragment.java:236)
                                                                                      at android.app.SharedPreferencesImpl$EditorImpl.notifyListeners(SharedPreferencesImpl.java:479)
                                                                                      at android.app.SharedPreferencesImpl$EditorImpl.apply(SharedPreferencesImpl.java:387)
                                                                                      at android.preference.Preference.tryCommit(Preference.java:1419)
                                                                                      at android.preference.Preference.persistString(Preference.java:1452)
                                                                                      at android.preference.ListPreference.setValue(ListPreference.java:148)
                                                                                      at android.preference.ListPreference.onDialogClosed(ListPreference.java:283)
                                                                                      at android.preference.DialogPreference.onDismiss(DialogPreference.java:395)
                                                                                      at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1328)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                      at android.os.Looper.loop(Looper.java:148)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:5527)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

最佳答案

在项目中的线程完成后,调用 System.gc();方法。

关于android如何避免这种内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37776939/

相关文章:

android - java.lang.NoClassDefFoundError 当 crouton 库在 eclipse 中

android - 如何从 JSON 文件中获取数据?

java - JAR 执行期间的内存问题

android - 在将过滤器应用于图像时避免内存不足异常 (Android)

android - 创建一个自定义 Drawable 并在 XML 中使用它

java - 如何在 android 中的图像上放置图钉标记图像?

android - 通过复制一些数据 android 重新创建一个 firebase 对象

gradle - Gradles Maven-publish插件在发布大文件(350MB)时吞噬了堆(1GB)

android - 我可以使用 selector drawable 和 LinerLayout 来表示不同的状态吗?

Android:canvas.drawBitmap 和 BitmapDrawable.draw 之间的区别?