Android UI优化— App启动优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangguangchao/article/details/85063699

黑白屏产生的原因和解决办法

黑白屏产生的原因

1、还没加载到布局文件,就已经显示了window窗口背景
2、黑屏白屏就是window窗口背景

容易产生黑白屏的地方

1、Activity的onCreate()中

       @Override  
       protected void onCreate(Bundle savedInstanceState) {                                              
                super.onCreate(savedInstanceState);
              //这里逻辑过于耗时或者布局文件过于复杂                                     
                setContentView(R.layout.activity_main);
      }

2、Application的onCreate()中

      @Override
      public void onCreate() {
            super.onCreate();
          //这里的逻辑过于复杂,耗时多
      }

黑白屏解决办法

1、避免在加载布局文件之前在主线程中执行耗时操作
2、给Window设置背景,将其设为透明或者和Splash界面一样

App启动页优化

启动页优化思路

App启动页的正常写法是设置一个SplashActivity,App启动时先显示SplashActivity,然后由SplashActivity跳转到MainActivity。但是这种通常的做法有一个致命问题,就是如果MainActivity的布局如果比较复杂,则进入主界面的时候会有明显的卡顿和加载过程,并且有些头重脚轻。
针对上述问题,可以做一些优化处理,如下:

把SplashActivity改成SplashFragment,应用程序的入口改为MainActivity。在MainActivity中先展示SplashFragment,当SplashFragment显示完毕后再将它remove,同时在SplashFragment显示的友好时间内进行网络数据缓存等预处理事务,在窗口加载完毕后,我们加载activity_main的布局,考虑到这个布局有可能比较复杂,耽误View的解析时间,采用ViewStub的形式进行懒加载。这样一开始只要加载SplashFragment所展示的布局就可以了,当MainActivity需要显示的时候也把准备工作(加载布局、预处理等)做好了。

流程如下:
1、把SplashActivity改成SplashFragment
2、在SplashFragment显示的时间内进行网络数据缓存等工作
3、采用ViewStub的形式加载activity_main的布局

MainActivity的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.ge.jgc.cloudecg.activity.MainActivity">

   //替换为主界面布局
    <ViewStub
        android:id="@+id/content_viewstub"
        android:layout="@layout/main_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>   

   //显示 SplashFragment
    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

MainActivity的代码如下:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        setContentView(R.layout.activity_main);
        
        final SplashFragment splashFragment = new SplashFragment();
        final ViewStub mainLayout = (ViewStub) findViewById(R.id.content_viewstub);
        
        //1、首先显示启动页面
        FragmentManager supportFragmentManager = getSupportFragmentManager();
        if (supportFragmentManager != null) {
            FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
            if (fragmentTransaction != null) {
                fragmentTransaction.replace(R.id.container, splashFragment);
                fragmentTransaction.commit();
            }
        }
        //2、进行一些预处理事务
        //3、渲染完毕后,立刻加载主页布局
        getWindow().getDecorView().post(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, " getWindow().getDecorView().post");
                View mainView = mainLayout.inflate();
                //初始化主界面
                initView(mainView);
            }
        });
        //4、 splashFragment显示一段时间之后移除
        getWindow().getDecorView().post(new Runnable() {
            @Override
            public void run() {
                mHandler.postDelayed(new DelayRunnableImpl(MainActivity.this, splashFragment), 3000);
            }
        });
    }

猜你喜欢

转载自blog.csdn.net/jiangguangchao/article/details/85063699