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<String, Void, Void> {
        @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<String, Void, Void> {
        @Override
        protected Void doInBackground(String... strings) {
           //需要执行的代码
            return null;
        }
    }

总结:本篇都是自己使用到的优化方法,为达到activity加载块,尽可能减少代码量,减少xml布局,见到onCreate的代码,多使用异步加载和回调方法,欢迎补充

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值