📜  如何在 Android 中使用位图池?

📅  最后修改于: 2022-05-13 01:58:44.483000             🧑  作者: Mango

如何在 Android 中使用位图池?

如果您的程序在滚动或分页时出现抖动或缓慢,您可以尝试一些方法。这使您可以使用诸如 GPU Overdraw 和 Profile GPU 渲染之类的东西来找出问题所在。但有时你只是无法弄清楚滞后的问题,因为这基本上是由于图像,太精确的位图。如果您的 Android 应用程序使用大量图像或位图,那么您的应用程序肯定会出现巨大的性能下降,并且会遭受不必要的延迟,这可能会激怒用户并让他/她卸载它,这是您永远不想要的。因此,每当图像回栈时,它基本上都会调用垃圾收集器,并且频繁调用它会导致 UI 冻结。

解决方案?

这个问题的解决方案相当简单,你甚至可能在不知不觉中将它与 Glide 或 Picasso 等现代图书馆一起使用! Glide Bitmap Pool 是一个内存管理库,允许您重用位图内存。因为它重用了位图内存,所以不需要重复调用垃圾收集器,从而使程序运行更流畅。在支持的 Android 版本上,它使用 inBitmap 解码位图。通过利用位图池来最小化应用程序中的持续内存分配和释放,您可以减少 GC 开销,从而使应用程序更加稳定。

观看来自 100 Days of Google 开发人员的视频,了解如何重用位图并避免您的应用程序崩溃/挂起。

解释

假设我们需要将 10 个位图导入我们的 Android 应用程序。当我们加载位图 1 时,会分配位图 1 的内存。然后,当我们不再需要位图的一段时间后,我们不应该回收位图(因为回收涉及调用 GC)。将此位图一用作位图二的inBitmap 。因此,相同的存储器可以用于位图二。

重用相同的位图

让我们将上述解释应用到一个实际的 Android 项目中,以更好地理解重用概念:

Java
Bitmap gfgBitmap = BitmapFactory.decodeFile(gfgPath);
imageView.setImageBitmap(gfgPath);
  
// Here the gfgPath is the path of 
// the bitmap where it is located.
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePathTwo, options);
  
if (canUseForInBitmap(bitmapOne, options)) {
    options.inMutable = true;
    options.inBitmap = bitmapOne;
    // Setting these options are 
    // the most important part!!!!!
}
  
options.inJustDecodeBounds = false;
Bitmap gfgBitmap2 = BitmapFactory.decodeFile(gfgPath2, options);
imageView.setImageBitmap(gfgPath2);


有了这个,您现在可以重用位图而无需重复调用 GC,因此您的 android 应用程序具有增强的性能,现在不会由于重用位图而滞后。