据我了解(不是我是正确的)当应用程序完成时,Drawables通常会正确地从内存中删除。然而,位图需要手动回收,有时甚至会写一个特殊的类来处理它们。 我的问题是,在关于内存和泄漏,是它更为有利简单地绘项目棍子像这样:Drawable vs Single可重用Bitmap与内存更好?
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();
我已经当然也读过,您必须小心地使用Bitmap上的recycle()方法,因为它们可以在仍然使用的情况下被移除?似乎这些问题以不同形式出现,但我无法从这个问题上得到任何人的直接答复。一个人说,重复使用位图,每次使用后回收,和其他人说使用可绘制和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();
}
}
任何适用的洞察力会非常赞赏,虽然。谢谢
谢谢,非常好的资料。我通过findViewById(R.Id.Image_name)获取我的视图;顺便说一句。不知道这是否以某种方式留下了对上下文的引用。 –