gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:29:39 29 4
gpt4 key购买 nike

据我了解(不是我说得对)当应用程序完成时,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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com