2017-01-19 2 views
5

У меня есть операции A и B. Когда я запускаю активность B из активности A, я устанавливаю статическую битмап-переменную на активность B. Я показываю это растровое изображение на экране и поворачиваю его.Использование памяти не уменьшается даже при переработке растровых изображений

Когда действие B закончено, я перерабатываю все растровые изображения по методу onDestroy(), но использование памяти не уменьшается.

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (bitmap90 != null) { 
     bitmap90.recycle(); 
     bitmap90 = null; 
    } 
    if (bitmap180 != null) { 
     bitmap180.recycle(); 
     bitmap180 = null; 

    } 
    if (bitmap270 != null) { 
     bitmap270.recycle(); 
     bitmap270 = null; 
    } 

    if (mBitmap != null) { 
     mBitmap.recycle(); 
     mBitmap = null; 
    } 

    if (((BitmapDrawable) ivOriginal.getDrawable()).getBitmap() != null) { 
     ((BitmapDrawable) ivOriginal.getDrawable()).getBitmap().recycle(); 
     ivOriginal.setImageDrawable(null); 
    } 

    if (((BitmapDrawable) ivOriginal90.getDrawable()).getBitmap() != null) { 
     ((BitmapDrawable) ivOriginal90.getDrawable()).getBitmap().recycle(); 
     ivOriginal90.setImageDrawable(null); 
    } 

    System.gc(); 
} 
+0

Возможно, вы держите ссылку на свои растровые изображения где-то в другом месте. Обычно использование статических свойств не рекомендуется. Почему бы вам не сохранить ваши растровые изображения в файле, а затем прочитать его в своей активности B? –

ответ

2

От Android Developer

Свободное нативный объект, связанный с этой битовой карты, и очистить ссылку на данные пикселей. Это не освободит данные пикселя синхронно; он просто позволяет собирать мусор, если нет других ссылок. Растровое изображение отмечено как «мертвое», что означает, что оно выдает исключение, если вызывается getPixels() или setPixels(), и ничего не рисует. Эта операция не может быть отменена, поэтому ее следует вызывать, только если вы уверены, что для растрового изображения больше не используются. Это расширенный вызов и, как правило, не нужно вызывать, так как обычный процесс GC освободит эту память, если больше нет ссылок на это растровое изображение.

утилизация только гарантирует, что ваше растровое изображение будет переработано всякий раз, когда вызывается GC. То же самое касается System.gc, он не может гарантировать, что gc будет запускаться прямо сейчас, он просто попросит gc запустить, но GC будет работать только тогда, когда система захочет его запустить.

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

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