草庐IT

android - Drawable vs Single reusable Bitmap 更好的内存?

coder 2023-06-04 原文

据我了解(不是我说得对)当应用程序完成时,Drawables 通常会正确地从内存中删除。然而,位图需要手动回收,有时甚至需要编写一个特殊的类来正确处理它们。 我的问题是,关于内存和泄漏,像这样简单地坚持使用 Drawables 是否更有益:

myView.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image));
myView1.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image1));
myView2.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image2));

而不是像位图这样的东西:

Bitmap tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);
myView.setImageBitmap(tmpBitmap);

tmpBitmap.recycle();
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image1);
myView1.setImageBitmap(tmpBitmap);

tmpBitmap.recycle();
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image2);
myView2.setImageBitmap(tmpBitmap);
tmpBitmap.recycle();

我当然也读过,您必须小心位图上的 recycle() 方法,因为它们可以在仍在使用时被删除?似乎这些问题不断以不同的形式出现,但我真的无法从任何人那里得到一个直接的答案。有人说要重用 Bitmap 并在每次使用后回收,还有人说使用 Drawables 和 unbindDrawables() 方法(这是我一直在使用的):

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
        ((ViewGroup) view).removeAllViews();
    }
}

任何适用的见解将不胜感激。谢谢

最佳答案

位图不需要手动回收。它们像 Drawable 和其他对象一样被垃圾收集。同样,您不需要取消绑定(bind)可绘制对象,除非在非常特殊的情况下。您似乎阅读了很多误导性信息。

在某些情况下(例如,如果您的应用处理大量位图数据或以静态方式存储可绘制对象),回收位图和取消绑定(bind) drawable 可能很有用。

您在问题开头显示的两个示例是等效的。如果您直接加载可绘制对象,则将代表您加载位图。如果您手动加载位图并将其设置在 ImageView 上,它们将代表您包含在可绘制对象中。

使用第一个解决方案,因为它更简单,并且在您真正需要它们之前不必担心解除绑定(bind)和其他内存管理技术。

关于android - Drawable vs Single reusable Bitmap 更好的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7044770/

有关android - Drawable vs Single reusable Bitmap 更好的内存?的更多相关文章

随机推荐