有人会认为第二种方法会更有效,但我不能说我看到使用它有任何改进。以下两者之间有区别吗?(当然是记忆明智)
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 被三重时。
其他注意事项
-
在 Honeycomb 之前的 Android 版本中,位图的内存是从非托管内存中分配的。至少需要 2 次 GC 才能收集它。另一件事是 - 这真的很难追踪 - DDMS 看不到它,MAT 也没有。
-
https://developer.android.com/training/displaying-bitmaps/manage-memory.html 阅读此链接。如果 api 级别>10,我认为我们不需要调用回收。
请参阅此链接...它提供了有关如何逐步实现的所有详细信息和代码示例。
https://developer.android.com/training/displaying-bitmaps/manage-memory.html
希望这有帮助。
在您的特定示例(第一个)中,您实际上并没有重用源,而只是覆盖bm
的值,使其指向新的位图,在这种情况下,您无法再在源位图上调用recycle
,因为您不再具有对它的引用。
我建议使用第二种方法来确保源位图被回收。