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