2013-04-30 38 views
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的原生图库应用程序,它似乎并不有一个“加载更多图片”按钮,而是一个无休止图像流?

谢谢

回答

1

MICRO_KIND缩略图不是很大,你很可能会被罚款。但是,如果您将应用放在那里,您绝对会发现存在内存问题的人。这将是由于疯狂的照片数量,平庸的设备或两者的结合。

您可以计算缩略图的内存使用情况。创建一个或两个缩略图并不难,找出它们有多大。然后你可以计算可用的堆(3.0之前的本机堆,3.0之后的Dalvik堆),并了解你可以创建多少堆。

你可以在你的代码这一点得到你的光标的项目数:

光标pictureCursor = getContentResolver()查询(Images.Media.EXTERNAL_CONTENT_URI, 投影,NULL,NULL,MediaStore。 Images.Media._ID); int numberOfImages = pictureCursor.getCount() HashMap thumbnails = new HashMap();

然后知道你是否有足够的空间。如果空间有限,则需要做出设计决策 - 或者警告用户不要使用它,或者只查看第一个“x”图像,然后释放这些图像并向用户加载另一组图像请求。

0

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

我建议你在链接

http://www.youtube.com/watch?v=_CruQY55HOk看看视频。

如果遇到内存泄漏,可以使用MAT分析器来查找并修复问题。

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

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