Android面试大全(四大组件篇)
Android面试大全(性能优化篇)
Android面试大全(异常处理篇)
Android面试大全(开源框架篇)
Android面试大全(网络篇)
Android面试大全(java篇)
前言
android中的性能优化这一方面不止是一道面试题,也是项目中必须要做的一件事情,只有做好的性能方面的优化,用户体验满意度才会有所提升
分类
启动黑白屏问题
- 安装app后,启动时会有短暂的白屏,这大大影响整体的美观,姑且在这里也给算在性能优化这一块
- 出现白屏原因
系统加载布局文件是需要时间的,在刚启动时布局文件还没加载完毕(即setContentView(int)
之前)显示的是window背景,出现的白屏(或黑屏)是window的背景色 - 解决办法
- 替换window的背景(可为图片或纯色)
只需在启动activity界面根标签下设置android:theme="@style/MyTheme"
属性
自定义一个style
- 出现白屏原因
<style name="Mytheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@mipmap/ic_launcher</item>//设置图片
<item name="ndroid:windowBackground">@color/fireBar</item>//设置纯色
<item name="android:windowNoTitle">true</item>//去title
</style>
- 注意事项
- 设置属性只能设置在启动页,不能设置在
application
标签下,此标签代表全局 - 设置图片最好是
.9.png
类型图片(此种图可适配机型),若使用.png
图片需考虑不同机型适配问题(切多种分表率的图)
- 设置属性只能设置在启动页,不能设置在
布局优化
- 减少嵌套的层级(可使用RelativeLayout),减少嵌套层级可加快加载效率,
- 使用style提取相同view的公共属性,减少重复代码
- 使用include标签
- 合理使用ViewStub
图片的优化
android中图片的使用是非常占用内存资源的。
- ①:在图片未使用时,及时recycle()回收
- ②:使用三级缓存,内存-sd卡-网络
内存中再次获取最快,由于内存有限可能被gc回收,sd卡中的图片不会回收,当前面两种都不存在所需图片时,才去网洛下载 - ③:将大图片进行压缩处理再放到内存中,用到
BitmapFactory
类
/**创建缩略图方法
*filepath 图片路径
i 压缩比例,最终为原图的1/(i^2)
*/
private Bitmap onCreateThumbnail(String filePath, int i) {
BitmapFactory.Options options=new BitmapFactory.Options();
//设置为不读内容,值读取边界值
options.inJustDecodeBounds=true;
//通过编辑,得到边界值,并存入到option中
BitmapFactory.decodeFile(filePath,options);
//赋值缩放比例
options.inSampleSize=i;
//设置显示的图片格式
options.inPreferredConfig=Config.RGB_565;
//设置为读取内容,
options.inJustDecodeBounds=false;
//得到缩略图
return BitmapFactory.decodeFile(filePath2, options);
}
- ④:尽量不在Button上使用
selector
来设置点击与正常时背景图,因为在button初始化时会将选中状态与正常状态的两张图都加载都内存中,无疑在无意中加大了内存的占用,可xml中设置正常的背景,在setOnTouchListener
监听中通过代码动态改变,在按下时显示选中状态北京,抬起恢复
final Button button=new Button(this);
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//手指按下
button.setBackgroundResource(R.mipmap.down);
break;
case MotionEvent.ACTION_UP:
//手指抬起,恢复
button.setBackgroundResource(R.mipmap.up);
break;
}
//为了监听事件的分发,返回false
return false;
}
});
- 图片解码率也会影响图片所占内存
常见的png,JPG,webp等格式的图片在设置到UI上之前需要经过解码过程,而图片采用不同的码率,也会造成对内存的占用不同。- ARGB_4444 格式的解码率,这种格式的图片,看起来质量太差,已经不推荐使用。 而强烈推荐使用ARGB_8888来代替。一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites 。 共16bytes,即2个字节
- ARGB_8888 格式的解码率,一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bytes , 共32bytes , 即4个字节。这是一种高质量的图片格式,电脑上普通采用的格式。它也是Android手机上一个BitMap的默认格式。
- RGB_565格式的解码率,一个像素占用2个字节,没有alpha(A)值,即不支持透明和半透明, Red(R)值占5个bytes ,Green(G)值占6个bytes ,Blue(B)值占5个bytes,共16bytes,即2个字节。 对于半透明颜色的图片来说,该格式的图片能够达到比较好的呈现效果,相对于ARGB_8888来说也能减少一半的内存开销,因此它是一个不错的选择。推荐使用
大量数据优化
- 分页加载
- 缓存方式
列表项优化
- listview的优化
- convertview的复用(View的复用)
- viewholder类的使用,减少查找控件的次数(
findviewbyid()
次数),将holder与view绑定来实现(.setTag()
、.getTag()
) - 数据分页加载
- RecycleView的优化
其他优化
- 网络优化
- 同一个页面数据尽量放到一个接口中去处理
- 使用Application Context代替Activity Context
- 谨慎使用static 关键字
- static使用不当容易造成内存泄漏
- 数据库优化
- 电量优化
- 多线程并发引发的性能等
正在持续跟新中……