Android性能优化之图片优化
最近不是很忙,就在看一些学习视频,做出了一些简单的总结(可能和视频有些类似,不过就当我借鉴的吧,毕竟我是用来总结的,emmmmm)。
先总结下为什么要做图片优化,以及图片优化的好处吧!
一、内存消耗变小。
二、流畅度变好。
三、减少流量的使用。
四、能使APK包变小。
五、用户体验更佳。
现在有很多第三方的图片加载框架,都可以使用,简单方便快捷,比如glide和fresco。不过我用的最多的还是glide,fresco我也只是简单的了解过,并未使用过。
先总结下图片存储优化
一、什么是OOM?
android系统的进程(APP级别)有最大内存限制,超出这个限制系统就会报出OOM的异常。
二、图片OOM产生的情况
1.一个页面一次加载过多的图片
2.加载一张超大的图片没有进行压缩处理(尺寸,质量)
3.android列表加载大量bitmap没有使用缓存
图片存储优化主要是以下三点:尺寸压缩、质量压缩、内存重用
一、尺寸压缩
bitmap里有个inJustDecodeBounds属性 设置为true
如果inJustDecodeBounds设置为true的话,解码bitmap时可以只返回其高、宽和Mime类型,而不必为其申请内存,从而节省了内存空间
inSampleSize
nSampleSize的默认值和最小值为1(当小于1时,解码器将该值当做1来处理),且在大于1时,该值只能为2的幂(当不为2的幂时,解码器会取与该值最接近的2的幂)。例如,当inSampleSize为2时,一个20001000的图片,将被缩小为1000500,相应地,它的像素数和内存占用都被缩小为了原来的1/4
改变ImageView的大小
二、质量压缩
常见的PNG、JPG、WEBP(这个我还真没用过)等格式的图片在设置到UI上之前需要经过解码过程
使用RGB_565替代ARGB_8888可以降低图片占用内存(RGB_565一个像素点占用2个字节,ARGB_8888一个像素点占用4个字节)
三、内存重用
这个我还真不知道怎么总结 一会代码里会提到
四、Bitmap的内存管理
在android3.0之前,对于像素数据的支持保存在本地内存中
从android3.0开始,像素数据和位图都保存在Dalvik堆中
public class PicTestActivity extends Activity {
private ImageView img_test;
private static final String TAG=PicTestActivity.class.getSimpleName();
private Bitmap mCurrentBitmap;//内存重用,不再重新创建bitmap对象,直接使用申明好的,重复使用就可以做到内存重用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pic_test);
img_test=findViewById(R.id.img_test);
}
/**
* 直接加载load sdcard里的图片
*/
private void LoadOriginalSize(ImageView img){
String sdcard= Environment.getExternalStorageDirectory().toString();
String filePath=sdcard+"/11.jpg";
mCurrentBitmap=BitmapFactory.decodeFile(filePath);
img.setImageBitmap(mCurrentBitmap);
}
/**
* 压缩图片
*/
private void testPicOptimize(ImageView img){
String sdcard= Environment.getExternalStorageDirectory().toString();
String filePath=sdcard+"/11.jpg";
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeFile(filePath,options);
// img.setImageBitmap(BitmapFactory.decodeFile(filePath,options));
int width=options.outWidth;
options.inSampleSize=width/200;
options.inPreferredConfig=Bitmap.Config.RGB_565;
options.inJustDecodeBounds=false;
Bitmap bitmap=BitmapFactory.decodeFile(filePath,options);
img.setImageBitmap(bitmap);
}
/**
* inBitmap的使用
*/
private void testInBitmap(ImageView img){
String sdcard= Environment.getExternalStorageDirectory().toString();
String filePath=sdcard+"/11.jpg";
BitmapFactory.Options options=new BitmapFactory.Options();
options.inBitmap=mCurrentBitmap;
Bitmap bitmap=BitmapFactory.decodeFile(filePath,options);
img.setImageBitmap(bitmap);
}
}
图片加载优化
一、异步请求(图片放在后台请求)
二、图片缓存(对于列表中的图片进行缓存)
三、网络请求(使用OKhttp进行网络请求)
四、懒加载(当图片呈现到可视区域再进行加载)