2015-01-13 2 views
1

Строя диалог, который загружает содержимое макета вида (setContentView) Я заметил странную вещь: Загруженный макет имеет ImageView с фоном этого диалога:Память, используемая ImageView никогда не выпустили

<ImageView android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:src="@drawable/preloader_bg_small" 
      android:id="@+id/background_img" 
     /> 

Каждый раз, когда диалог показывает (в различных видах деятельности) она истощает памяти (30Мб) само изображение 290k JPG не загружается из локального ресурса и нИКОГДА не освобождается

Я пытался загрузить изображение программно:

((ImageView)dialog.findViewById(R.id.background_img)).setImageResource(R.drawable.preloader_bg_small); 

, а затем выгрузки его перед смещать в диалоговом

((ImageView)dialog.findViewById(R.id.background_img)).setImageDrawable(null); 

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

Есть ли способ освободить память? Почему ImageView ведет себя так?

Спасибо за помощь!

+2

изображение дрены память 30 МБ? вы уверены, что это образ? как пробовать управление памятью DDMS, чтобы увидеть, что вызывает проблему и что занимает это пространство. –

+0

Когда я удаляю тег ImageView, это не происходит –

+1

Я вижу в ddms, что android.graphics.BitmapFactory выделяет память. –

ответ

1

Хотя его все еще странно решен следующим образом:

загрузки изображения путем установки вытяжки, а не ресурсы непосредственно:

((ImageView)dialog.findViewById(R.id.background_img)).setImageDrawable(getResources().getDrawable(R.drawable.preloader_bg_small)); 

и выпуская его из памяти, установив Drawable обнулить

ImageView background_image = ((ImageView) dialog.findViewById(R.id.background_img)); 
      background_image.setImageDrawable(null); 
+0

Я попробовал ваше предложение, и оно не сработало. –

+0

@EB Вы нашли решение для своей проблемы? – swalkner

0

Android управляет Dialog s для вас как для оптимизации. К сожалению, он не удаляет Dialog с после того, как они были использованы. Он держит их в надежде, что вы будете использовать их снова. В общем, это не является преимуществом для вашего приложения. Но так оно и работает.

Что вам нужно сделать, так это удалить (удалить) свои Dialog s после того, как они были уволены. Вы делаете это, вызывая removeDialog(), когда вам больше не нужен ваш Dialog.

+0

как попробовать это? Он уже устарел. –

+0

@AmberBeriwal Прежде всего, «устаревший» не означает, что вы не можете его использовать, и это не значит, что он больше не работает. Если вы читаете документацию, она устарела, потому что вместо этого вы хотите использовать «DialogFragment». Но если вы используете обычный старомодный «Диалог», вы все равно можете вызвать 'removeDialog()'. –

+0

У меня нет большого опыта работы с Android-разработкой, но я столкнулся с подобной проблемой. Я не мог связать removeDialog() с ImageView. Было бы полезно, если бы вы могли дать некоторый намек или образец для справки. –

0

Попробуйте ((ImageView)dialog.findViewById(R.id.background_img)).setImageResource(android.R.color.transparent); Но это не похоже на проблему с изображением. Ваша деятельность сохраняет ссылку на изображение. Пожалуйста, дайте больше кода.

0

Пример использования метода BitmapDrawable ресурса ImageView осуществляется следующей функцией:

protected void recycleDefaultImage() { 
    Drawable imageDrawable = imageView.getDrawable(); 
    imageView.setImageDrawable(null); //this is necessary to prevent getting Canvas: can not draw recycled bitmap exception 

    if (imageDrawable!=null && imageDrawable instanceof BitmapDrawable) { 
     BitmapDrawable bitmapDrawable = ((BitmapDrawable) imageDrawable); 

     if (!bitmapDrawable.getBitmap().isRecycled()) { 
      bitmapDrawable.getBitmap().recycle(); 
     } 
    } 
}