位图内存泄漏

时间:2016-11-15 14:46:09

标签: android memory-leaks bitmap garbage-collection

我遇到了来自位图的内存泄漏问题。每次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)。

0 个答案:

没有答案