2016-06-12 4 views
1

У меня есть много изображений, которые говорят, что 500ish разбросаны по 20 или около того фрагментов, все изображения очень маленькие, и все это загружается нормально, однако я предоставляю пользователю выбор от 3-х разных видов изображений, и прямо сейчас, если пользователь меняет изображения, я получаю ошибку OOM, поэтому я думаю, что это способ обработки изображений. Думаю, мне нужно сначала переработать старые, но я не уверен, как это сделать, кто может помочь?android как избежать этой ошибки из памяти

вот как я заполнить мой адаптер Ive только добавил два пункта, чтобы упростить вещи

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; 
     } 
    } 
} 

поэтому, как упоминалось, я думаю, что мне нужно запустить это в своем собственном потоке и очистить и изображения, которые нужны arent больше, но я думаю, что они больше для него, чем кто-нибудь может помочь?

здесь трассировки стека

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) 
+0

может у поста трассировки стека Oom экс? – ceph3us

ответ

1

если вид изображения держать экземпляр растрового изображения вытяжки

Drawable drawable = imageView.getDrawable(); 
if(drawable!=null && BitmapDrawable.class.isAssignableFrom(drawable.getClass())) { 
    BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; 
    Bitmap bitmap = bitmapDrawable.getBitmap(); 
    if(bitmap != null && !bitmap.isRecycled()) bitmap.recycle(); 
} 

но ...

При загрузке растровых изображений из рисуемых папок, которые не большой (большой, как в мегабайтах), тогда вы не должны сталкиваться с проблемой.

Если вы загружаете активы, вам необходимо проверить, насколько они оптимальны для того, где вы их показываете, например, нет смысла устанавливать ImageView на изображение размером 1024 x 1024, если область, в которой вы показываете изображение, является размер 64х64.

OOM часто вызван загрузкой изображений неизвестного размера или просто получением неправильного размера изображения, как описано выше, при замене ImageView часто обычно не возникает проблема с изображениями оптимального размера.

Вы должны прочитать некоторые рекомендации по растровых изображений:

https://developer.android.com/training/displaying-bitmaps/index.html

для Вашего случая:

это необходимо фрагмент из трассировки стека:

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) 

Не удалось выделить 2073612 байтов с 559872 бесплатными байтами и 546 КБ до OOM

так вообще:

  • в методе TwoFragment.prepareCardData (TwoFragment.java:280) Befor вызова Resources.getDrawable (..) вы должны получить вид изображения и рециркуляционного точечный рисунок ..
  • в фрагменте/активности следует также переработать растровое изображение в методе

OnDestroy() без дополнительной код, я не в состоянии определить, например, некоторые петли вызывают OOM или вы не отпуская ресурсы ...

вы также можете сделать это (масштаб изображения) перед настройкой до ресурса зрения изображения:

Out of Memory Error ImageView issue

осторожности !!!

Не используйте изображение, которое вы уже переработали.

Вы получите исключение: Canvas: попытка использовать рециркулированное растровое изображение

bitmap.recycle() не является строго обязательным для андроида> 2.3.3. Если вы все равно хотите восстановить эту память, вам нужно будет найти способ проверить, когда битмап действительно больше не нужен (т. Е. Canvas имел возможность завершить операции рисования).

проблема заключается в том, что вы, вероятно, широко используете растровые изображения (скорость распределения может быть больше скорости, с которой растровое изображение получает рециркуляцию), тогда вы можете захотеть переработать неиспользуемые битовые карты ASAP. Вы должны вызвать recycle(), когда вы закончите используя растровое изображение.

Всегда помните, не пытайтесь переработать растровое изображение, когда оно показывается на экране.

так:

  • ссылка захвата старой битовая карта
  • установлен новый
  • вид Invalidate
  • проверить, если старая битовая карта уже не переработана
  • утилизации старым один
  • вы также можете вызвать System.gc();^

^Указывает VM, что было бы подходящим временем для запуска сборщика мусора. Обратите внимание, что это только подсказка. Нет никакой гарантии, что сборщик мусора фактически будет запущен.

звонок в ImageView.setImageBitmap(); или сходство не будет использовать память, используемую растровым ...

Почему?потому что, когда и смотреть на осущ метода ImageView особенно:

private void updateDrawable(Drawable d) { 
    if (d != mRecycleableBitmapDrawable && mRecycleableBitmapDrawable != null) { 
     mRecycleableBitmapDrawable.setBitmap(null); 
    } 
... 


public void setImageResource(@DrawableRes int resId) { 
    // The resource configuration may have changed, so we should always 
    // try to load the resource even if the resId hasn't changed. 
    final int oldWidth = mDrawableWidth; 
    final int oldHeight = mDrawableHeight; 

    updateDrawable(null); 
.... 

public void setImageBitmap(Bitmap bm) { 
    // Hacky fix to force setImageDrawable to do a full setImageDrawable 
    // instead of doing an object reference comparison 
    mDrawable = null; 
    if (mRecycleableBitmapDrawable == null) { 
     mRecycleableBitmapDrawable = new ImageViewBitmapDrawable(
       mContext.getResources(), bm); 
    } else { 
     mRecycleableBitmapDrawable.setBitmap(bm); 
    } 
    setImageDrawable(mRecycleableBitmapDrawable); 
} 

Смотри также:

https://developer.android.com/training/displaying-bitmaps/manage-memory.html

+0

ive добавила трассировку стека, средний размер изображения в соответствии с тем, что говорит файловый менеджер, составляет около 60 КБ, изображение не больше 200х200, хотя изображение часто намного меньше, поэтому я обязательно возьму твои очки на борту, –

+0

будет вы рекомендуете делать это в асинхронной задаче или это избыточное и, возможно, избыточное? –

+0

некоторые из изображений, которые я повторно использую, снова пытаются получить доступ и дают мне ошибку, которую вы предсказали. –

Смежные вопросы