我遇到了来自位图的内存泄漏问题。每次Activity启动并绘制我的自定义视图时,我需要加载20个随机Drawable(从50个可能)。
这是初始化的一部分,我声明了Drawables
resources = getResources();
theme = context.getTheme();
count = 20;
degree = (2 * Math.PI) / count;
for (int i = 0; i < count; i++) {
views.add(new CircleImageView(context));
}
int rand;
Set<Integer> randomImages = new HashSet<>();
Random rnd = new Random(System.currentTimeMillis());
while (randomImages.size() < count) {
rand = rnd.nextInt(50) + 1;
randomImages.add(resources.getIdentifier("ph_" + rand, "drawable", "com.bitgenie.friends"));
}
randomImagesArray = new int[count];
// int iter = 0;
for (Integer i :
randomImages) {
drawables.add(ResourcesCompat.getDrawable(resources,i,theme));
//iter++;
}
randomImages.clear();
创建CustomView时,它只运行一次。 我创建Set只提供唯一的资源ID。你可以看到CircleImageViews的创建(de.hdodenhof:circleimageview)。
然后在onLayout方法中我将setDrawable设置为每个CircleImageView
for (int i = 0; i < views.size(); i++) {
final CircleImageView currentUserPic = views.get(i);
Glide.clear(currentUserPic);
Glide.with(context.getApplicationContext()).load("")
.placeholder(drawables.get(i)).into(currentUserPic);
}
我希望Glide可以帮助减少图像尺寸。
之前就是这样的currentUserPic.setImageDrawable(drawables.get(i));
当活动调用onDestroy()时,我在我的CustomView中调用onDestroy()
public void onDestroy()
{
for (CircleImageView v :
views) {
Glide.clear(v);
Bitmap b = ((BitmapDrawable)v.getDrawable()).getBitmap();
v.setImageDrawable(null);
v.setImageBitmap(null);
v = null;
b.recycle();
}
for (Drawable drawable :
drawables) {
((BitmapDrawable)drawable).getBitmap().recycle();
drawable = null;
}
drawables.clear();
rouletteImage.setImageBitmap(null);
rouletteImage.setImageDrawable(null);
rouletteImage = null;
views.clear();
this.removeAllViews();
}
我试图回收所有可能的东西,甚至试图调用System.gc(),但它没有帮助。所有这些位图(来自Drawables)仍然在内存中。如果我使用&#34;原因GC&#34;从Android Studio中它可以释放大量内存(80mb - > 30mb)。