1、对于不再使用的ImageView,除了设置visibility之外,还需调用imageView.setImageDrawable(null)
将其图片置空。否则,除非这个ImageView被销毁,否则它的图片对象会一直占用内存。
2、使用Glide加载Layout的背景图,而不是直接写在布局的background里。
Glide.with(this).load(R.mipmap.ic_launcher)
.into(new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable d, GlideAnimation<? super GlideDrawable> a) {
linearLayout.setBackground(d);
}
});
上图明显的显示出这两种方式的优劣:对于一张1080P的图片,在布局中直接设置background属性,app的内存占用接近60M,而使用Glide之后,仅仅占用了8M的内存,降低了将近50M。
通过计算,1080*1920*24/1024/1024 = 47M,也就是说一张1080P的24位Bitmap会占用47M的内存,这也是为什么尽量避免直接使用大尺寸图片直接作为布局背景的原因。而这个内存的占用是和原图片占用空间大小无关的,不管原图是1MB还是20KB。