2012-07-03 3 views
0

У меня следующая проблема, что некоторые из вас должны знать, на мой андроид приложения:Android Bitmap слишком тяжелая ошибка

3288-байтовый внешнее распределение слишком велик для этого процесса.

Из памяти: Heap Size = 5959KB, Выделено = 3922KB, Bitmap Size = 18614KB

VM не позволит нам выделить 3288 байт

Факты:

  • I создавая растровое изображение экрана (настолько огромное), и я манипулирую им (изменяя размер и т. д.) для создания анимации листания страницы.

  • Он падает только по желанию HTC: на галактике s2 и разжигайте огонь, никаких проблем.

  • Я уже desallocating текущего растровые каждый раз я создаю новый с помощью следующего кода:

    Bitmap старого = this.bitmap;

    this.bitmap = bitmap; 
    this.invalidate(); 
    if(old != null) 
        old.recycle(); 
    
  • Я также tryied вызвать эту функцию:

    общественного аннулируются рецикла() { если this.bitmap.recycle(); (this.bitmap! = NULL) System.gc(); Runtime.getRuntime(). Gc(); }

Severals время в моем коде, и иногда это становится немного лучше (как он выходит из строя чуть позже), но это еще не хорошо.

  • Я потратил много времени на эту проблему, и я действительно не понимаю, как это исправить. Это как на форуме, есть много дезинформации, поэтому я потерян.

Спасибо, попросите больше точности.

Edit:

Вот код называется много:

//set the foreground image with the current day 
        Bitmap b = Bitmap.createBitmap(visibleLayout.getWidth(), visibleLayout.getHeight(),Bitmap.Config.ARGB_8888); 
        Canvas c = new Canvas(b); 
        visibleLayout.draw(c); 

        viewBitmapNext.setBitmap(b); 

        viewBitmapNext.setVisibility(View.VISIBLE); 

Где viewBitmapNext является overwritted элемент View класса. Функция setBitmap описана выше.

О resizement, я эту строку кода:

viewBitmapPrevious.setLayoutParams(new RelativeLayout.LayoutParams((int) (iterator - ((totalWidth - iterator) - activity.getResources().getDimension(R.dimen.margin_right))/2), RelativeLayout.LayoutParams.WRAP_CONTENT)); 

Опять же, скажите мне, если вы вы хотите знать больше.

+0

Вы делаете это только один раз и сталкиваетесь с ошибкой? Или вы используете этот код несколько раз? – ThomasW

+1

Вы связываете (прикрепляете) растровое изображение к любому Drawable или любому элементу иерархии View? Если да, возможно, вам также потребуется установить эту ссылку на нуль. Обратите внимание, что recycle() не освобождает память, она просто отмечает растровое изображение, которое должно быть выпущено (это полезно в устройствах pre-HONEYCOMB, где растровые изображения хранятся в собственной растровой куче). Вызов gc(), безусловно, не поможет в вашей проблеме. Более того, эти связанные с растровым разломом ошибки часто напрямую не связаны с самими растровыми изображениями, а скорее с некоторой другой ошибкой в ​​вашем коде (например, с помощью Drawable leak из-за утечки активности через статическую переменную). –

+0

@ThomasW Когда я не использую функцию рециркуляции, происходит сбой в первый раз. –

ответ

0

Я узнал, в чем проблема. Это не будет интересно для всех, потому что это тупая ошибка, тесно связанная с моим проектом, но я все равно говорю.

Я на самом деле было 2 ошибки:

  • один петельные элементы создания infinitly.
  • Две большие фотографии, которые я положил в качестве фона после определенного действия, выполненного на дешевом телефоне (я все еще на нем, но это должно быть легко решить). Я отредактирую этот ответ, когда это будет сделано.

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

Спасибо.