Android(安卓)优化篇
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的代码,多使用异步加载和回调方法,欢迎补充
更多相关文章
- Android的webview研究
- 【Android(安卓)性能优化】应用启动优化 ( 安卓应用启动分析 | L
- Android异步加载图像小结
- android纹理图片的加载与修改
- Android图片加载与缓存开源框架:Android(安卓)Glide
- android 下载网络pdf文件后并显示
- Android(安卓)Low memory killer
- Android的webview研究
- Android(安卓)-- ContentProvider的使用及需要注意的点