1

Что я получаю с сайта разработчика: «Если во время загрузки общий размер анимации превышает значение виртуальной кучной памяти, эта ошибка будет иметь место», а для решения - BitmapFactory. Я попробовал в нижнем коде:java.lang.OutOfMemoryError появляется на анимации Загрузка?

Теперь вопрос: «что несет ответственность за эту ошибку?»:

  1. ли размеры изображения учитываются при загрузке изображений для анимации.

    Нравится: Если у меня 10 размеров изображений (1100 * 1100) и используйте рисунок ARGB_8888 для изображения.

  2. Размер изображения (500 КБ, 1 МБ и т. Д.) Также имеет значение для этой ошибки.

  3. or Both несет ответственность за эту ошибку.

  4. Если я использую более одной анимации на один вид деятельности, чем я change this Activity to another Activity, Как освободить всю память, я использую в предыдущей деятельности по AnimationDrawable?

Все предложения приветствуются. благодаря

Код

public class AdActivity extends Activity { 

ImageView iView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_ad); 

    iView = (ImageView) findViewById(R.id.iView); 

    //iView.setBackgroundResource(R.drawable.anim); // (1) 

    try{ 
      // (2) 
     iView.setImageBitmap(decodeSampleBitmapFromResource(getResources(), R.drawable.anim, 100, 100)); 

     AnimationDrawable frameAnimation = (AnimationDrawable) iView.getBackground(); 
     frameAnimation.start(); 
    } 
    catch(Exception e){ 
    } 
} 

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 

    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     final int heightRatio = Math.round((float) height/(float) reqHeight); 
     final int widthRatio = Math.round((float) width/(float) reqWidth); 

     inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
    } 

    return inSampleSize; 
} 

public static Bitmap decodeSampleBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { 

    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(res, resId, options); 

    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeResource(res, resId, options); 
} 

} 

Две вещи:

  1. Где я упоминаю комментарий с (1), это простой способ получить анимацию в ImageView, но в этом случае размер используемого файла составляет около 44 МБ, когда приложение запускается. 'Run Perfect'

  2. Где я упоминаю (2) в попытке, Это решение, которое дается веб-разработчиком Android here.

Я не пытался ошибаться и размер был apporox 11Mb, когда приложение запущено, но анимация не отображается в ImageView.

Пожалуйста, предложите мне, что я сделал не так?

+0

, пожалуйста, проверьте: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html#load-bitmap –

+0

прямо сейчас, я не использую ни одного изображения .. anim - это xml-файл, который используется в анимации .. @stack_ved –

ответ

1

вы можете решить вашу ошибку 1) увеличить Dalvik размер кучи на Android: largeheap = «истина» в файле манифеста

2) если ваш повторно использовать ваши декодированные изображения, то вам нужно реализовать Lrucache

3) всякий раз, когда вы декодируете какое-либо изображение с помощью decodeSampleBitmapFromResource(), тогда его refences хранятся в native heap.it, которые могут быть очищены System.gc() для восстановления памяти, но мы не можем зависеть от этого, потому что это решение ОС, когда выпустить Это.

4) Если и хотят, чтобы очистить родную кучу, вы должны написать код в НКА

+0

Увеличить размер кучи ... Это не очень хорошая идея. Как я изучил –

+0

У меня немного смущение, потому что мне нужно сделать все это с анимацией и всеми образами, обрабатываемыми через xml-файл. Поэтому я хочу знать, что, если я должен добавить все изображения анимации с помощью программно ... или что-то еще, что мы можем сделать для достижения этого –

0

Вы проверили значение inSampleSize?

options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

Вы можете сохранить ссылку на растровую и перерабатывают в растровое . Вы только что установили одно изображение, как вы можете видеть анимацию? См. AnimationDrawable. эта анимация состоит из нескольких кадров.

+0

Я пробовал, и я знаю, что это невозможно, Его единственное для единственного изображения, поэтому для анимации. Мне нужно добавить Frame для анимации программно или что-то еще? –

+0

, если вы не настраиваете фреймы в xml, вам нужно динамически добавлять их по коду. вы пытались использовать «public void addFrame (Drawable frame, int duration)»? добавьте более 1 кадра, чтобы проверить эффект. – yushulx

+0

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

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