2014-09-22 2 views
2

Я хотел масштабировать изображение, чтобы они сохраняли одинаковое соотношение. Так, например, стрелка имеет одинаковый размер во всех изображениях после масштабирования. Поэтому я последовал за this example, и он отлично работает. Но после потери манипуляций из списка, я могу получить ошибку OutOfMemoryError. Я записываю кучу кучи в DDMS, и это правильно, размер выделения всегда увеличивается. Я положил bitmap.recycle(), но это приводит к ошибке: "cannot draw recycled bitmaps".Утечка памяти с масштабированием растрового изображения

Я также пробовал the official tutorial, но у меня были проблемы, загруженный образец не совпадает с объясненными, и я не все понимаю.

Пожалуйста, не могли бы вы объяснить мне, как решить мою ошибку? Благодаря

+0

Что вы подразумеваете под "some bitmap.recycle()" ?? Там * СЛЕДУЕТ *, и я имею в виду ¡¡MUST !! быть переработкой для каждого из размещенных экземпляров растровых изображений. Если потребление памяти не увеличится и не повысится. И нет никаких оснований для этого не продолжать расти, даже если вы распоряжаетесь всеми ними, если пользователь слишком быстро провоцирует перегрев. – eduyayo

ответ

0

Bitmaps всегда хранится в устройстве Heap памяти и устройство куча памяти не может позволить себе такое количество Bitmaps, как может быть так, как вы пытаетесь работы на том же разрешении изображения, So, сначала попытаться grow the heap помощью манифеста приложения, то попробуйте этот способ, чтобы изменить размер вашего Bitmaps:

public static Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight) { 

     if(bitmapToScale == null) 
      return null; 
     //get the original width and height 
     int width = bitmapToScale.getWidth(); 
     int height = bitmapToScale.getHeight(); 
     // create a matrix for the manipulation 
     Matrix matrix = new Matrix(); 

     // resize the bit map 
     matrix.postScale(newWidth/width, newHeight/height); 

     // recreate the new Bitmap and set it back 
     return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix, true); 

    } 

, если это не работает, либо, таким образом, вы должны сделать одно из следующих действий:

  1. присваивать каждому изображению гораздо меньшую ширину и высоту.
  2. сжать изображение, используя что-то вроде ImageLoader.
  3. использовать другое устройство с большим количеством пустое пространство.
  4. Ограничение количества используемых изображений.

ПОДСКАЗКА: рециркуляции Bitmap полностью удаляет его из памяти кучи, так, что логично иметь ошибку "cannot draw recycled bitmaps", поэтому, если вы хотите recycle его, а затем использовать его в своем приложении, вы должны сначала сохраните его в чем-то вроде ArrayList<Bitmaps>.

+0

Я уже вырастил кучу в манифесте, и ваше решение затруднено, так как я не знаю конечного размера изображения. Спасибо за Ваш ответ –

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