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的代码,多使用异步加载和回调方法,欢迎补充

更多相关文章

  1. Android的webview研究
  2. 【Android(安卓)性能优化】应用启动优化 ( 安卓应用启动分析 | L
  3. Android异步加载图像小结
  4. android纹理图片的加载与修改
  5. Android图片加载与缓存开源框架:Android(安卓)Glide
  6. android 下载网络pdf文件后并显示
  7. Android(安卓)Low memory killer
  8. Android的webview研究
  9. Android(安卓)-- ContentProvider的使用及需要注意的点

随机推荐

  1. Android(安卓)去除String中的空格等
  2. android获取本机的IP地址和mac物理地址
  3. Android(安卓)打印堆栈
  4. Android(安卓)实现再按一次后退键退出应
  5. asynchttpclient post方法使用
  6. android 多点触摸 实现图片缩放 Image Zo
  7. How to set up a link betwteen a real A
  8. android 按钮的文字显示不全
  9. JS怎样调用Android本地原生方法
  10. Android安装APK时出现Local path doesn't