Android优化老生常谈的两大类
1.适配
2.优化
因android系统方法区别于oc系统,对于屏幕渲染有些方法不开源,所以经常会遇到ui堵塞,造成activity打开慢,或者动画渲染卡顿。
这里分为三大类讲解,XML首先布局优化(个人认为是ui优化最为重要的一块)
android开发人员常用的两大类,必然就是线性布局(LinearLayout)和相对布局(RelativeLayout)这也是面试经常会问,这两个布局那个渲染更快一些,其实都一样,只是线性布局添加比重属性(layout_weight)会从新计算一次大小 所以会慢一点。
XML优化
1.避免嵌套多层布局
这个比较好理解,就是尽可能的减少多层嵌套就像下图这样,一个imageview嵌套了4个布局。这样会增加ui展示的速度,也就是把xml代码降低到越少越好。
2.ViewStub
懒加载布局,对于非立即显示,或者复用率低的布局可使用ViewStub来加载布局,
ViewStub和 Gone的区别,
Gone在布局中高宽都为0,不加载xml,但会初始化布局检测到Gone的布局,并把属性加载到缓存当中,
而ViewStub在不inflate view之前是不会占用内存,像SurfaceView和TextureView这种加载较大的控件可使用ViewStub来加载,
可以在activity UI加载完毕后在判断是否展示ViewStub的内容
3.SurfaceView和TextureView
对于动画渲染要求高的可使用SurfaceView来制作屏幕动画,SurfaceView的有点就是不会占用主线程,像android常用的动画( Animation)还有补间动画,帧动画,还有自己写的Ui渲染,只要View在变化,那一定就是占用到主线程,但SurfaceView做动画时不会占用主线程,避免主线程堵塞。
4.include
include是android提供的方法,可用于加载xml,主要用于减少项目重复代码。
总结,XML的代码越少越好,那些乱七八糟的属性能不用就不用!
Activity优化
一说到activity优化,肯定想到的就是activity的生命周期,如果对生命周期不熟的,请自行百度那张表,一张所有android开发人员都看过无数次的Activity生命周期表,咱这里就不说了。我们只做我们的优化
1.异步加载xml
这个应该有不少人都知道,也是android源生功能。AsyncLayoutInflater 可以异步地加载布局,并通过 OnInflateFinishedListener 接口回调到 UI 线程,但这个功能暂时不能再fragment使用,
new AsyncLayoutInflater(MainActivity.this).inflate(R.layout.activity_main, null, new AsyncLayoutInflater.OnInflateFinishedListe
@Override
public void onInflateFinished(@NonNull View view, int i, @Nullable ViewGroup viewGroup) {
//view:加载得到 view
setContentView(view);
//一系列的 findViewById(...)
}
});
2.UI加载完毕在执行网络请求或者后台服务
/*
ui加载布局后调此方法
*/
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
getCaptureHelper()
.decodeFormats(DecodeFormatManager.QR_CODE_FORMATS) // 设置只识别二维码会提升速度
.playBeep(true)
.vibrate(true);
}
(UI加载完毕后执行)像一些签到,广告弹出可以在这里加载,不影响使用的前提,可把一些操作写在这里。
3.异步加载
onCreate少做些操作,在onResume中执行,加快activity的显示速度。
@Override
protected void onResume() {
super.onResume();
new NewsAsyncTask().execute();
}
private class NewsAsyncTask extends AsyncTask {
@Override
protected Void doInBackground(String... strings) {
//需要执行的代码
return null;
}
}
4.缓存
之前项目经理让我把所有的图片都加在缓存里,当时我是拒绝的,这样对用户手机增加大量缓存,对用户不好,但项目经理对我说 android和html最大的区别就是缓存,好吧 我被说服了。
图片本地缓存通过链接查找本地文件并展示 这是我的另一篇博客,主要记录缓存图片的方法,如首页列表图片缓存,如图片不存在直接通过gride显示,并把图片转换成btm加载到缓存,再次展示通过图片地址查询图片是否存在,并展示。
5.Activity管理
一般项目都会从新BaseActivity(一般都是这个命名)可以使用fragment加载布局,在baseactivity上在集成个activity ,这个activity只有一个fragment,每个activity加载进来都使用fragment来加载,这样除了方便管理,还可以写全局动画。只要把每个布局传进来就可以展示。
FrameLayout frameLayout = (FrameLayout) findViewById(R.id.frame_sing);
View inflate = LayoutInflater.from(this).inflate(getLayoutID(), null);
frameLayout.addView(inflate);
总结 onCreate里面的代码能少就少
Fragment优化
1.使用setUserVisibleHint和OnHiddenChanged两种方法做判断,判断是否显示是否第一次加载等相关操作。
//这个方法我的理解就是已加载和未加载
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
// setUserVisibleHint在初始化Fragment的时候也会调用,且在onCreateView之前,所以mView会为null
// mView是否初始化标志,防止回调函数在mView为空的时候触发
if (view == null) {
return;
}
if(isVisibleToUser){// 不在最前端显示 相当于调用了onPause();
}else {// 在最前端显示 相当于调用了onResume();
}
}
//这个方法每次进来都会调用一次
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {// 界面可见
//TODO now visible to user
getData(true);
} else {// 界面不可见 相当于onpause
//TODO now invisible to user
}
}
2.异步加载 跟activity一样 异步加载 放在onResume中其余跟Activity差不多
@Override
protected void onResume() {
super.onResume();
new NewsAsyncTask().execute();
}
private class NewsAsyncTask extends AsyncTask {
@Override
protected Void doInBackground(String... strings) {
//需要执行的代码
return null;
}
}
总结:本篇都是自己使用到的优化方法,为达到activity加载块,尽可能减少代码量,减少xml布局,见到onCreate的代码,多使用异步加载和回调方法,欢迎补充