0

对于我的应用程序,我目前正在阅读存储在手机上的所有图像 (JPEG) 文件并将它们的 ID 和缩略图(不是原始位图)保存到 HashMap 上。

代码:

final String[] PROJECTION =
                new String[] {MediaStore.Images.Media._ID};

Cursor pictureCursor = getContentResolver().query(Images.Media.EXTERNAL_CONTENT_URI, 
                PROJECTION, null, null, MediaStore.Images.Media._ID);

HashMap<Integer,Bitmap> thumbnails = new HashMap<Integer,Bitmap>();

int id;
int id_index = pictureCursor.getColumnIndex(MediaStore.Images.Media._ID);

int THUMBNAIL_TYPE = MediaStore.Images.Thumbnails.MICRO_KIND;
ContentResolver content_resolver = context.getContentResolver();

while (pictureCursor.moveToNext()) {

    id = pictureCursor.getInt(id_index);
    Bitmap thumbnail = MediaStore.Images.Thumbnails.getThumbnail(content_resolver, id, THUMBNAIL_TYPE, null);
    thumbnails.put(id, thumbnail);
}

我的手机上目前有 200 张图片,现在可以正常使用。但我担心在某些时候,应用程序会耗尽内存并崩溃。

我需要考虑内存不足吗?或者缩略图是否足够小以至于实际上应用程序不会耗尽内存?

编辑 如果我担心内存不足,如果我想要像 Android 的本机图库应用程序这样的东西,最好的方法是什么,它似乎没有“加载更多图像”按钮,而是无穷无尽的图像流?

谢谢

4

2 回答 2

1

MICRO_KIND 缩略图不是很大,你很可能会没事的。但是如果你把你的应用程序放在那里,你绝对会发现有记忆问题的人。这可能是由于照片数量过多、设备平庸或两者兼而有之。

您可以计算缩略图的内存使用情况。创建一两个缩略图并找出它们的大小应该不会太难。然后您可以计算可用堆(3.0 之前的原生堆,3.0 之后的 Dalvik 堆)并了解您可以制造多少。

您可以在代码中此时获取光标中项目的计数:

光标图片Cursor = getContentResolver().query(Images.Media.EXTERNAL_CONTENT_URI, PROJECTION, null, null, MediaStore.Images.Media._ID); int numberOfImages = pictureCursor.getCount() HashMap thumbnails = new HashMap();

然后知道你是否有足够的空间。如果您的空间有限,您将需要做出设计决定——要么警告用户它不起作用,要么只查看前“x”个图像,然后释放这些图像并在用户处加载另一组图像要求。

于 2013-05-01T03:26:50.913 回答
0

这取决于堆大小和您的应用程序的内存密集程度。

我建议你看看链接中的视频

http://www.youtube.com/watch?v=_CruQY55HOk

如果遇到内存泄漏,您可以使用 MAT Analyzer 查找并修复问题。

您需要减少内存使用量,如果堆大小增加并且您的应用程序需要堆空间,则 gc 会启动以释放内存。但是如果没有足够的空间,你很可能会遇到内存泄漏。

http://developer.android.com/training/articles/perf-tips.html

于 2013-04-30T22:18:59.383 回答