写点什么

Android 开发必会 App 启动优化,骚年你的屏幕适配方式该升级了

用户头像
Android架构
关注
发布于: 刚刚

initOkHttp();


initSobot();


setRxJavaErrorHandler();


}


}).start();


将需要在主线程中初始化但是可以不用立使用的控件功能延迟加载:


handler.postDelayed(new Runnable() {


@Override


public void run() {


//延迟初始化组件


}


}, 3000);


注意: 并不是每一个组件的初始化以及操作都可以异步或延迟;是否可以取决组件的调用关系以及自己项目具体业务的需要。保证一个准则:可以异步的都异步,不可以异步的尽量延迟。让应用先启动,再操作。


//子线程初始化第三方组件


//建议延迟初始化,可以发现是否影响其它功能,或者是崩溃!


Thread.sleep(5000);

2、闪屏 Activity 优化:

Activity 的 UI 层级优化:

优化前 UI 布局:


<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:layout_width="match_parent"


android:layout_height="match_parent"


android:background="@mipmap/icon_splash_bg">


<ImageView


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:src="@mipmap/icon_splash_word"


android:layout_centerVertical="true"


android:layout_centerHorizontal="true"


android:paddingBottom="160dp"


/>


<ImageView


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:layout_centerHorizontal="true"


android:src="@mipmap/icon_splash"


android:layout_alignParentBottom="true"


android:layout_marginBottom="@dimen/dp_41"


/>


<com.pxwx.student.modulecore.widget.TouchRelativeLayout


android:id="@+id/rl_adsRl"


android:layout_width="match_parent"


android:layout_height="match_parent"


android:gravity="center_horizontal|top"


android:orientation="vertical" >


<ImageView


android:id="@+id/iv_SplashAd"


android:layout_width="match_parent"


android:layout_height="match_parent"


android:background="@null"


android:contentDescription="@null"


android:scaleType="fitXY"


android:visibility="gone" />


</com.pxwx.student.modulecore.widget.TouchRelativeLayout>


<TextView


android:id="@+id/tv_adjump"


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:background="@drawable/ad_jump_selector"


android:gravity="center_vertical|center_horizontal"


android:layout_alignParentRight="true"


android:layout_marginRight="@dimen/dp_18"


android:layout_marginTop="@dimen/dp_30"


android:paddingBottom="@dimen/dp_5"


android:paddingLeft="@dimen/dp_11"


android:paddingRight="@dimen/dp_11"


android:paddingTop="@dimen/dp_5"


android:text="跳过 3"


android:textColor="@color/white"


android:textSize="@dimen/font_15"


android:visibility="gone"


/>


</RelativeLayout>


简化后:


<?xml version="1.0" encoding="utf-8"?>


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:layout_width="match_parent"


android:layout_height="match_parent"


android:background="@drawable/welcome_layler_drawable">


<ViewStub


android:id="@+id/vs"


android:layout_width="match_parent"


android:layout_height="match_parent"


android:layout="@layout/layout_stub_avd" />


</FrameLayout>

ViewStub 初始化延迟

针对项目中的启屏广告业务,通过 ViewStub 延后他们的初始化,在需要显示的时候通过 ViewStub 的 inflate 显示真正的 view,优化如下


<ViewStub


android:id="@+id/vs"


android:layout_width="match_parent"


android:layout_height="match_parent"


android:layout="@layout/layout_stub_avd" />


开屏广告业务布局抽取


layout_stub_avd.xml


<?xml version="1.0" encoding="utf-8"?>


<com.pxwx.student.modulecore.widget.TouchRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:id="@+id/rl_adsRl"


android:layout_width="match_parent"


android:layout_height="match_parent">


<ImageView


android:id="@+id/iv_SplashAd"


android:layout_width="match_parent"


android:layout_height="match_parent"


android:background="@null"


android:contentDescription="@null"


android:scaleType="fitXY" />


<TextView


android:id="@+id/tv_adjump"


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:layout_alignParentRight="true"


android:layout_marginTop="@dimen/dp_30"


android:layout_marginRight="@dimen/dp_18"


android:background="@drawable/ad


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


_jump_selector"


android:gravity="center"


android:paddingLeft="@dimen/dp_11"


android:paddingTop="@dimen/dp_5"


android:paddingRight="@dimen/dp_11"


android:paddingBottom="@dimen/dp_5"


android:text="跳过 3"


android:textColor="@color/white"


android:textSize="@dimen/font_15" />


</com.pxwx.student.modulecore.widget.TouchRelativeLayout>


然后在代码中需要显示 webview 时进行 inflate:


/**


  • 懒加载广告视图


*/


private void showAvd() {


viewStub = findViewById(R.id.vs);


if (viewStub != null) {


viewStub.inflate();


mAdRl = findViewById(R.id.rl_adsRl);


mAdImage = findViewById(R.id.iv_SplashAd);


mAdJump = findViewById(R.id.tv_adjump);


}


}


优化点:


  1. 废弃之前的启屏页 UI 布局,直接使用先前自定义好的 welcome_layler_drawable 作为启屏页背景

  2. 将开屏广告 Ui 抽取分离

  3. 懒加载广告视图

onCreate 业务逻辑优化:

  1. 减少广告等业务逻辑时间这里属于业务逻辑的优化。

  2. onCreate 中针对广告业务的初始化业务优化,异步下载图片,等下次启动控制展示

总结

通用应用启动加速套路

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android开发必会App启动优化,骚年你的屏幕适配方式该升级了