2015-06-10 2 views
2

У меня есть ListView, а элементы в списке являются обычными View s. View класс имеет полеCanvas.drawBitmap() и освобождение памяти

private Bitmap bitmap; 

и onDraw метод View использует

canvas.drawBitmap(bitmap, matrix, paint); 

беда в том, что я адресности OutOfMemoryError с. Я хочу, чтобы освободить память, связанную с Bitmap, когда элемент прокручивается с экрана. Я думал, что могу написать bitmap = null, чтобы позволить сборщику мусора взять Bitmap, но я беспокоюсь, что canvas.drawBitmap может означать, что это не сработает. Делает ли canvas.drawBitmap держаться за ссылку на Bitmap? Или вызов canvas.drawBitmap означает, что сам объект Canvas имеет столько же памяти, сколько Bitmap? Проблема в том, что я действительно не понимаю, что такое Canvas, и что на самом деле делают различные вызовы draw. Спасибо за помощь.

ответ

0

If you're displaying large amounts of bitmap data in your app, you're likely to run into OutOfMemoryError errors. The recycle() method allows an app to reclaim memory as soon as possible.

Однако, если вы звоните рециркуляцию(), а затем попытку нарисовать растровое изображение, вы получите сообщение об ошибке: «Canvas: попытка использовать переработанный точечный рисунок».

Но вам нужно сделать подробное чтение the android's site training on Managing Bitmap Memory, так как у вас будут разные стратегии в соответствии с используемым вами API.

Взгляните на весь справочник Displaying Bitmaps Efficiently. Он содержит все, что вам может нужно для хранения вниз использование памяти:

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

Does canvas.drawBitmap hold onto a reference to the Bitmap? Or does the call canvas.drawBitmap mean that the Canvas object itself has as much memory as the Bitmap?

Холст содержит ссылку на растровое изображение, как вы его сформулировали.

Холст работает для вас как притворство или интерфейс, на фактическую поверхность, на которой будет нарисована ваша графика - она ​​содержит все ваши призывы «рисования». Через Canvas ваш рисунок фактически выполняется на базовом Bitmap, который помещается в окно. Холст будет рисовать на определенный битмап.

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