Android 位图内存泄漏

Android 位图内存泄漏,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

我的位图内存泄漏有问题。每次活动开始并绘制自定义视图时,我都需要加载20个随机绘图(可能从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();
当活动调用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();
}