Android - 位图操作,保留源位图或使用第二个位图并回收源



有人会认为第二种方法会更有效,但我不能说我看到使用它有任何改进。以下两者之间有区别吗?(当然是记忆明智)

Bitmap bm=MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(), id, MediaStore.Images.Thumbnails.MINI_KIND, null);
bm=cropAndScaleBitmap(bm);
//use bm

Bitmap bm=MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(), id, MediaStore.Images.Thumbnails.MINI_KIND, null);
Bitmap b =cropAndScaleBitmap(bm);
bm.recycle();
//use b

这里要注意的事情...

即使您指定了回收,它也只会产生任何影响 当下一个 GC 被三重时。

其他注意事项

  1. 在 Honeycomb 之前的 Android 版本中,位图的内存是从非托管内存中分配的。至少需要 2 次 GC 才能收集它。另一件事是 - 这真的很难追踪 - DDMS 看不到它,MAT 也没有。

  2. https://developer.android.com/training/displaying-bitmaps/manage-memory.html 阅读此链接。如果 api 级别>10,我认为我们不需要调用回收。

请参阅此链接...它提供了有关如何逐步实现的所有详细信息和代码示例。

https://developer.android.com/training/displaying-bitmaps/manage-memory.html

希望这有帮助。

在您的特定示例(第一个)中,您实际上并没有重用源,而只是覆盖bm的值,使其指向新的位图,在这种情况下,您无法再在源位图上调用recycle,因为您不再具有对它的引用。

我建议使用第二种方法来确保源位图被回收。

最新更新