我正在创建一个以循环方式显示图像视图的应用。它显示了设置的图标,例如蓝牙,wifi等。没有内存不足错误,但在完成活动后,应用程序仍然使用约。根据Memory Analyzer工具,位图上的15mb RAM。如何,我可以发布这些位图。
以下是创建圆形视图的代码:
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()
,但应用仍然使用15mb RAM。
我也在使用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 mb。资源也使用约。 4.5 mb。
答案 0 :(得分:0)
你有OOM问题吗?
由于您正在使用getDrawable(R.drawable.superAwesomeFractal)
Android正在维护位图的缓存 - 例如,如果您在两个不同的ImageView
上设置相同的drawable,则Android不会分配两倍的空间。也就是说,由于您没有明确创建/解码/使用位图,除非您看到实际问题(如OOM异常),否则您无需担心发布它们或回收它们的分配 - Android将为您处理。顺便提一下,为什么你会尝试重用循环位图这个例外。