2013-02-19 5 views
0

Я запускаю 2 AnimationDrawables в том же действии, и у меня ошибка памяти. Это довольно удивительно, потому что я уменьшил размер изображений (ширина = ширина экрана), и я не могу уменьшить его больше, поскольку качество будет ниже. Например, если я ширина = ширина экрана/2, wortks но качество ужасноAndroid: Ошибка памяти и размер/качество растрового изображения

В LogCat написано

02-19 10:56:44.769: E/dalvikvm-heap(3118): 383916-byte external allocation too large for this process. 
02-19 10:56:44.809: E/GraphicsJNI(3118): VM won't let us allocate 383916 bytes 
02-19 10:56:44.809: W/dalvikvm(3118): threadid=1: thread exiting with uncaught exception (group=0x40018560) 
02-19 10:56:44.819: E/AndroidRuntime(3118): FATAL EXCEPTION: main 
02-19 10:56:44.819: E/AndroidRuntime(3118): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 

Я не думаю, что у меня есть утечка памяти, но проверяя эту статью http://android-developers.blogspot.de/2009/01/avoiding-memory-leaks.html Я попытался обнаружить потенциальную утечку памяти, но мне кажется, что нет.

Мне действительно нужна помощь, поскольку это не моя первая ошибка памяти в этом проекте, и я всегда стараюсь справиться с этим.

Вот мой код:.

private void startAnimation(AnimationDrawable animation1,AnimationDrawable animation2){ 
    int drawables[] = new int[] {R.drawable.fire1,R.drawable.fire2,R.drawable.fire3,R.drawable.fire4,R.drawable.fire5,R.drawable.fire6,R.drawable.fire7,R.drawable.fire8,R.drawable.fire9,R.drawable.fire10down2,R.drawable.fire11down2,R.drawable.fire12down2,R.drawable.fire13down2,R.drawable.fire14down2,R.drawable.fire15down2,R.drawable.fire16down2}; 
    int drawables2[] = new int[] {R.drawable.fire14down2,R.drawable.fire14down2,R.drawable.fire14down2,R.drawable.fire14down2,R.drawable.fire14down2,R.drawable.fire14down2,R.drawable.fire14down2,R.drawable.fire14down2,R.drawable.fire14down2,R.drawable.fire10up,R.drawable.fire11up,R.drawable.fire12up,R.drawable.fire13up,R.drawable.fire14up,R.drawable.fire15up,R.drawable.fire16up}; 
    bitmapDrawable = new BitmapDrawable[drawables.length]; 
    bitmapDrawable2 = new BitmapDrawable[drawables2.length]; 
    for (int i=0;i<drawables.length;i++) { 
     bitmapDrawable[i]=new BitmapDrawable(decodeSampledBitmapFromResource(getResources(), drawables[i],width)); 
     Log.w("BITMAP","i="+i); 
     bitmapDrawable2[i]=new BitmapDrawable(decodeSampledBitmapFromResource(getResources(), drawables2[i],width)); 
     animation1.addFrame(bitmapDrawable[i],50); 
     animation2.addFrame(bitmapDrawable2[i],50); 
    } 
    animation1.setOneShot(true); 
    animation2.setOneShot(true); 
    image2.setLayoutParams(params); 
     image2.setImageDrawable(animation1); 
     image2.post(new Starter(animation1)); 
     image3.setLayoutParams(params); 
     image3.setImageDrawable(animation2); 
     image3.post(new Starter(animation2)); 

} 
     class Starter implements Runnable { 
      AnimationDrawable animation = new AnimationDrawable(); 
      public Starter(AnimationDrawable animation) { 
       this.animation = animation; 
      } 

      public void run() { 
       animation.start(); 
      } 
     } 

Как я могу уменьшить вес Bitmap (если это необходимо проблема может где-то else_ и сохранить качество theimages я не вижу, где проблема, я использую только 30 изображений, другие приложения используют гораздо более

ответ

0

вы можете создать ScaledBitmap с вашими, чтобы уменьшить его размер для EX: -

Bitmap scaledBitmap = Bitmap.createScaledBitmap(oldBitmap, 600, 600, 
         false); 

это уменьшит его размер до 600x600 и уменьшит его размер. вы можете изменить пиксели, для которых u нравится

+0

как я сказал, когда уменьшаю размер, качество меня не удовлетворяет, поэтому мне бы хотелось, чтобы другие решения – morg

0

здесь вы измените качество.

try { 
      BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); 
      bmpFactoryOptions.inJustDecodeBounds = true; 
      bmpFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; 


      bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(
        imageFileUri), null, bmpFactoryOptions); 


      bmpFactoryOptions.inSampleSize = 2; 
      bmpFactoryOptions.inJustDecodeBounds = false; 
      bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(
        imageFileUri), null, bmpFactoryOptions); 

здесь я использую этот метод для получения изображения с SD-карты. а затем отобразите его.

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