0

Я создаю приложение, которое показывает образы изображений круговым способом. Он показывает значки настроек, например, Bluetooth, Wi-Fi и т. Д. Ошибка в памяти отсутствует, но после завершения действия приложение все еще использует ок. 15 МБ ОЗУ на битмапах в соответствии с инструментом анализатора памяти. Как я могу освободить эти растровые изображения.Как освободить память, занятую растровыми изображениями

Вот код для создания кругового обзора:

settingsImageViews = new ArrayList<View>(0); 

    // create settings icon views 
    for (int i = 0; i <= 12; i++) { 
     ImageView imageView = new ImageView(this); 
     if (i > 2 && i != 10) { 
      imageView.setImageDrawable(getSettingsIcon(i - 3)); 
     } else if (i == 10) { 
      imageView.setImageDrawable(getResources().getDrawable(R.drawable.ic_key)); 
     } else { 
      imageView.setImageDrawable(null); 
     } 

     settingsImageViews.add(imageView); 
    } 

    settingsCircularView = new CircleView(this, CIRCLE_RADIUS, settingsImageViews); 
    parentLayout.addView(settingsCircularView); 

Для кругового обзора, я использую этот код: custom circular view. placing of views

getSettingsIcon метод:

private Drawable getSettingsIcon(int settingId) { 
    switch (settingId) { 

    case 0:// bluetooth 
     if (PhoneSetting.isBluetoothOn()) 
      return getResources().getDrawable(R.drawable.ic_bluetooth); 
     else 
      return getResources().getDrawable(R.drawable.ic_bluetooth_off); 

    case 1:// wifi 
     if (wifiManager.isWifiEnabled()) 
      return getResources().getDrawable(R.drawable.ic_wifi_on); 
     else 
      return getResources().getDrawable(R.drawable.ic_wifi_off); 
    . 
    . 
    . 
    } 
} 

Я пытался переработать растровые изображения в методе onDestroy, но когда я снова открываю действие, он вылетает из-за ошибки trying to use a recycled bitmap android.graphics.Bitmap.

Я даже пытался позвонить System.gc(), но приложение все еще использует RAM 15 МБ.

Я также разрушаю все представления в onDestroy используя unbindDrawables метод:

private void unbindDrawables(View view) {  
     if (view.getBackground() != null) { 
       view.getBackground().setCallback(null); 
     } 
     if (view instanceof ViewGroup && !(view instanceof AdapterView)) { 
       for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
         unbindDrawables(((ViewGroup) view).getChildAt(i)); 
       } 
       ((ViewGroup) view).removeAllViews(); 
     } 
} 

После попытки всех вышеперечисленных вещей, даже не 1 мб был уменьшен. Ресурсы также используют прибл. 4,5 мб.

ответ

0

У вас проблемы с OOM?

С тех пор как вы используете getDrawable(R.drawable.superAwesomeFractal) Android поддерживает кеш растровых изображений - например, если вы устанавливаете одинаковое количество на двух разных ImageView, Android не выделяет в два раза больше места. То есть, поскольку вы явно не создаете/декодируете/не используете растровые изображения, если вы не видите фактические проблемы, такие как исключение OOM, вам не нужно беспокоиться о том, чтобы освободить их или перераспределить их распределения - Android будет обрабатывать это для вас. Кстати, почему вы получаете исключение из попыток повторного использования переработанного растрового изображения.

+0

Итак, я не могу освободить эту память? Но могу ли я уменьшить память, которую он потребляет? Если да, то как? –

+1

Создайте растровые изображения, убедившись, что вы используете оптимальное кодирование (т. Е. Если вам не нужна альфа, не используйте формат с альфой). Замените png с помощью xml созданных чертежей, где это возможно (например, градиентные фоны). Больше нечего делать, но опять же, не беспокойтесь о занимаемой памяти, если это не вызывает у вас проблем и не выходит за рамки (15mb не особенно, если вы показываете много изображений). –

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