1.MediaStore.Images.Media.insertImage导致的内存抖动问题
直接贴该方法的源码:
/**
* Insert an image and create a thumbnail for it.
*
* @param cr The content resolver to use
* @param imagePath The path to the image to insert
* @param name The name of the image
* @param description The description of the image
* @return The URL to the newly created image
* @throws FileNotFoundException
*/
public static final String insertImage(ContentResolver cr, String imagePath,
String name, String description) throws FileNotFoundException {
// Check if file exists with a FileInputStream
FileInputStream stream = new FileInputStream(imagePath);
try {
Bitmap bm = BitmapFactory.decodeFile(imagePath);
String ret = insertImage(cr, bm, name, description);
bm.recycle();
return ret;
} finally {
try {
stream.close();
} catch (IOException e) {
}
}
}
可以看到Bitmap bm = BitmapFactory.decodeFile(imagePath);
这句话,说明android把这个图片读取到内存中了,在这一步内存会上升。把这个图片插入到系统相册后,方法结束,内存被回收,然后内存下降,今天也是调试一个OOM问题才看到这里
2.Glide优化
还有一个Glide的优化,在低配置手机内存不够的时候,应该清空Glide的缓存,修改我们自己的Application类,加入如下代码
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
//TRIM_MEMORY_UI_HIDDEN这个值代表了当前应用的UI已不再可见。通过它,我们就可以认为应用进入了后台。
if(level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN){
Glide.get(this).clearMemory()
}
Glide.get(this).trimMemory(level)
}
override fun onLowMemory() {
super.onLowMemory()
//内存低的时候清除Glide的缓存
Glide.get(this).clearMemory()
}
网友评论