在内存不足之前,我可以存储多少缩略图?

时间:2013-04-30 22:09:31

标签: android memory-management thumbnails

对于我的应用程序,我目前正在阅读手机上存储的所有图像(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的原生图库应用程序那样最好的方法是什么,它似乎没有“加载更多图像”按钮而是无休止的图像流?

由于

2 个答案:

答案 0 :(得分:1)

MICRO_KIND缩略图不是很大,你很可能会很好。但是,如果你把你的应用程序放在那里,你绝对会发现有内存问题的人。这将是由于数量疯狂的照片,平庸的设备或两者的某种组合。

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

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

Cursor pictureCursor = getContentResolver()。query(Images.Media.EXTERNAL_CONTENT_URI,                 PROJECTION,null,null,MediaStore.Images.Media._ID); int numberOfImages = pictureCursor.getCount() HashMap缩略图= new HashMap();

然后知道你是否有足够的空间。如果你的空间有限,你需要做出一个设计决定 - 要么警告用户它不能工作,要么只看第一个“x”图像,然后释放它们并加载另一组用户请求。

答案 1 :(得分:0)

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

我建议您查看链接中的视频

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

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

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

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