当在 xml 布局中声明 2 个 ImageView 时,内存中有 2 个 drawable 副本?
When 2 ImageViews are declared in xml layout then there are 2 copies of drawable in memory?
当我有一个 xml 布局时:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/my_image" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/my_image" />
然后内存中有 2 个与 drawable 关联的位图实例还是只有一个?
好问题!!!
我查看了源代码,看起来它会为每个 ImageView 创建新的位图实例。所有这些都有一个繁琐的过程...
ImageView 使用 Drawable
Drawable 使用 ImageDecoder
ImageDecoder 使用 BitmapFactory
BitmapFactory 使用 native C++ code 进行图像解码。 (看第157行及以下)
简要查看代码告诉我它会为每个 ImageView 创建 bitmap Drawable 的新实例,即使使用相同的图像也是如此。我没有找到与此类优化相关的任何逻辑。
更新
是的,在位图加载的情况下进行了优化。 Abhisek Mallick 完全正确。即使不查看代码,也很容易检查。使用 ImageView 创建一个 RecyclerView。加载到那些 ImageView 的相同位图中。并尝试改变项目的数量。在更改时查看 Profiler->Memory。内存分配不会改变。
从 Resources
加载可绘制对象时,这些将使用 DrawableCache
进行缓存,即 ThemedResourceCache
。
ResourcesImpl
states in a comment:
// First, check whether we have a cached version of this drawable
// that was inflated against the specified theme. Skip the cache if
// we're currently preloading or we're not using the cache.
您可以在这里找到答案:
例如,每次创建 Button 时,都会从框架资源 (android.R.drawable.btn_default) 加载一个新的可绘制对象。这意味着所有应用程序中的所有按钮都使用不同的可绘制对象实例作为它们的背景。但是,所有这些可绘制对象共享一个公共状态,称为 "constant state."
来源:https://android-developers.googleblog.com/2009/05/drawable-mutations.html?m=1
当我有一个 xml 布局时:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/my_image" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/my_image" />
然后内存中有 2 个与 drawable 关联的位图实例还是只有一个?
好问题!!!
我查看了源代码,看起来它会为每个 ImageView 创建新的位图实例。所有这些都有一个繁琐的过程...
ImageView 使用 Drawable
Drawable 使用 ImageDecoder
ImageDecoder 使用 BitmapFactory
BitmapFactory 使用 native C++ code 进行图像解码。 (看第157行及以下)
简要查看代码告诉我它会为每个 ImageView 创建 bitmap Drawable 的新实例,即使使用相同的图像也是如此。我没有找到与此类优化相关的任何逻辑。
更新
是的,在位图加载的情况下进行了优化。 Abhisek Mallick 完全正确。即使不查看代码,也很容易检查。使用 ImageView 创建一个 RecyclerView。加载到那些 ImageView 的相同位图中。并尝试改变项目的数量。在更改时查看 Profiler->Memory。内存分配不会改变。
从 Resources
加载可绘制对象时,这些将使用 DrawableCache
进行缓存,即 ThemedResourceCache
。
ResourcesImpl
states in a comment:
// First, check whether we have a cached version of this drawable // that was inflated against the specified theme. Skip the cache if // we're currently preloading or we're not using the cache.
您可以在这里找到答案:
例如,每次创建 Button 时,都会从框架资源 (android.R.drawable.btn_default) 加载一个新的可绘制对象。这意味着所有应用程序中的所有按钮都使用不同的可绘制对象实例作为它们的背景。但是,所有这些可绘制对象共享一个公共状态,称为 "constant state."
来源:https://android-developers.googleblog.com/2009/05/drawable-mutations.html?m=1