大概会花一个月左右的时间出7-8个专题来分享一下在工作和学习中积累下来的Android性能优化经验。
希望大家会持续关注。
现在是专题二:内存优化
但这也仅仅是为大家提供一些思路与较为全面的总结,算不上什么,希望有错误或问题在下面评论。
最后完结以后会将思维导图与优化框架整理出来,请期待。
如果程序会运行着崩溃、或者突然被系统杀死,那你就该继续往下看。
这是这章的思维导图,不过压缩严重,下面是样图,原图和源文件在最下方链接。还是值得下载的。
题记
一、谈谈移动设备中的内存
二、采用合适的数据类型
总的来说,
就是:
三、你需要知道的访问内存
- 一级缓存
- 二级缓存
- 三级缓存(一般用于服务器机或游戏机器)
四、通过垃圾收集管理内存
五、通过Java中的引用来更好的管理
六、通过系统的API可以了解、管理内存
七、当内存少的时候可以这样处理
八、通过5R法来对ANDROID内存进行优化:
1.Reckon(计算)
2.Reduce(减少)
Reduce的意思就是减少,直接减少内存的使用是最有效的优化方式。
图片显示:
图片大小:
BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
bitmapFactoryOptions.inJustDecodeBounds = true;
bitmapFactoryOptions.inSampleSize = 2;
// 这里一定要将其设置回false,因为之前我们将其设置成了true
// 设置inJustDecodeBounds为true后,decodeFile并不分配空间,即,BitmapFactory解码出来的Bitmap为Null,但可计算出原始图片的长度和宽度
options.inJustDecodeBounds = false;
Bitmap bmp = BitmapFactory.decodeFile(sourceBitmap, options);
图片像素:
public static BitmapreadBitMap(Contextcontext, intresId) {
BitmapFactory.Optionsopt = newBitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
//获取资源图片
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is, null, opt);
}
bitmap.recycle();
bitmap = null;
捕获异常:
Bitmap bitmap = null;
try {
// 实例化Bitmap
bitmap = BitmapFactory.decodeFile(path);
} catch (OutOfMemoryError e) {
// 捕获OutOfMemoryError,避免直接崩溃
}
if (bitmap == null) {
// 如果实例化失败 返回默认的Bitmap对象
return defaultBitmapMap;
}
修改引用:
3.Reuse(重用)
4.Recycle(回收)
Thread t = new Thread() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
System.out.println("thread is running...");
} catch (InterruptedException e) {
}
}
}
};
t.start();
t = null;
System.gc();
@Override
protected void onDestroy() {
if (mAdapter != null && mAdapter.getCurosr() != null) {
mAdapter.getCursor().close();
}
super.onDestroy();
}
5.Review(检查)
Code Review(代码检查):
UI Review(视图检查):
总结:
链接点下方,如果不能用及时留言,莫名被删过
链接:http://pan.baidu.com/s/1hsK2Co0 密码:abcs