Android 位图内存泄漏
我的位图内存泄漏有问题。每次活动开始并绘制自定义视图时,我都需要加载20个随机绘图(可能从50个开始) 这是初始化的一部分,我在初始化中声明DrawablesAndroid 位图内存泄漏,android,memory-leaks,bitmap,garbage-collection,Android,Memory Leaks,Bitmap,Garbage Collection,我的位图内存泄漏有问题。每次活动开始并绘制自定义视图时,我都需要加载20个随机绘图(可能从50个开始) 这是初始化的一部分,我在初始化中声明Drawables resources = getResources(); theme = context.getTheme(); count = 20; degree = (2 * Math.PI) / count; for (int i = 0; i < count; i++) { views.ad
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();
当活动调用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)仍在内存中。如果我使用Android Studio中的“Cause GC”,它将释放大量内存(80mb->30mb)。System.GC()不保证垃圾收集器运行。与其说是执行,不如说是建议。不幸的是,在Java中,您只能听任系统摆布,系统会在合适的时候释放内存。如果应用程序确实需要更多内存,您可以将android:largeHeap=“true”
放在您的应用程序元素中。AndroidManifest.xmlSystem.gc()不保证垃圾收集器运行。与其说是执行,不如说是建议。不幸的是,在Java中,您只能听任系统摆布,系统会在合适的时候释放内存。如果您的应用程序确实需要更多内存,您可以将android:largeHeap=“true”
放在AndroidManifest.xml的application元素中
currentUserPic.setImageDrawable(drawables.get(i));
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();
}