Я создаю приложение, которое показывает образы изображений круговым способом. Он показывает значки настроек, например, 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 мб.
Итак, я не могу освободить эту память? Но могу ли я уменьшить память, которую он потребляет? Если да, то как? –
Создайте растровые изображения, убедившись, что вы используете оптимальное кодирование (т. Е. Если вам не нужна альфа, не используйте формат с альфой). Замените png с помощью xml созданных чертежей, где это возможно (например, градиентные фоны). Больше нечего делать, но опять же, не беспокойтесь о занимаемой памяти, если это не вызывает у вас проблем и не выходит за рамки (15mb не особенно, если вы показываете много изображений). –