美文网首页
启动优化·浅谈花哪儿记账在启动时的那些事

启动优化·浅谈花哪儿记账在启动时的那些事

作者: kongzue | 来源:发表于2017-03-01 16:10 被阅读53次

    前言

    花哪儿记账是一款相当简洁易用的记账工具,在功能的开发和设计上保持了相当高的克制,也正因为如此,在开发花哪儿记账的时候是没有设计广告闪屏这个元素的,启动APP会直接进入主界面,但是在主界面中会直接从数据库中读取用户记账的数据,当用户使用久了的时候就会产生大量的数据,那么此时就需要加快软件的启动速度了。那么本章我就讲讲如何加快APP的启动速度,即启动优化方向的一些技巧。

    问题在哪儿?

    先来谈谈问题出在哪。
    1.由于很多SDK的加入,造成启动效率降低。
    2.数据加载的问题,即大量的数据从SQLite数据库中加载出来时会导致软件在启动时出现严重卡顿现象,降低用户体验。

    解决它!

    首先,我们常常将SDK的载入放在Application里进行的,这没毛病,但要知道,若是SDK半天载入不了,往往就会造成卡顿了,我们想出了一个好办法,就是先让界面显示出来,在使用前把SDK给载入完成了,不就万事大吉了?
    于是,我们将载入SDK的代码放在这里:

    public class MainActivity extends BaseActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);    //载入布局
    
            //载入SDK
            SDK.initialize(getApplicationContext());
            ......
        }
        ......
    }
    

    然而事实是骨感的,打开APP,从点击图标到进入还是蛮流畅的,但是Activity的显示出现了白屏问题。同样的,如果直接在Activity的onCreate里加载用户数据,即从数据库中读取用户的账单显示到屏幕上,也会造成严重的卡顿,白屏出现,那么接下来,我们就需要解决白屏问题了。

    白屏问题的出现,主要是因为在布局加载到屏幕完成前加载了这些数据,导致布局无法呈现到屏幕上来。此时系统没有什么可显示的,就只好显示了一个白屏给我们了,那么,延迟加载数据不就可以了么?在这里,我们尝试使用多线程的方法来解决这个问题:

    public class MainActivity extends BaseActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);    //载入布局
    
            new Handler().postDelayed(new Runnable() {
                        public void run() {
                          //载入SDK
                          SDK.initialize(getApplicationContext());
                          //加载数据
                          ......
                        }
            }, 10);
            ......
        }
    

    果不其然,问题解决了,一点击图标就直接呈现了界面布局,然后数据会逐步加载进来。但是这样子也存在一个问题,即用户一点击图标,显示的布局因为没有数据就会出现错乱的问题,在花哪儿记账APP中,因为存在用户消费正常、快超支、已超支三种状态(如下图所示),界面样式若是一样的并不合适,因为用户若消费已超支,界面应该是红色的,但一打开APP却是默认蓝色界面,然后一闪变成了红色,那么该如何处理这样的问题呢?

    花哪儿各状态示意图.png

    于是我们将用户消费的状态记录起来,在软件启动后仅修改UI部分载入的主题,基本上解决了这个问题。

    测试与总结与坑...这就完了?

    too young,怎么会完了?一大堆bug等着你哼哼
    如此修改后确实存在着一些需要注意的问题,例如用户打开应用瞬间退出了怎么办?这可是多线程的啊,APP退了不代表线程不继续执行,于是乎在这里就翻车了...搞个线程锁,把这事儿解决了,说出来是给大家提个醒,别开开心心的忘记加锁在这里崩掉。

    完了?没呢

    对于不用更改UI布局的APP来说其实有个更简单粗暴的办法能提升APP的启动速度:先将没有数据的界面截个图做一个占位图(如下图所示)

    占位图.png

    然后创建一个启动Activity,例如FristActivity,进入style.xml,添加以下主题:

    <style name="welcomeTheme" parent="@android:style/Theme.Material.NoActionBar.Fullscreen" tools:targetApi="lollipop">
            <item name="android:windowBackground">@drawable/你的启动占位图</item>
    </style>
    

    接下来进入AndroidManifest.xml,修改FirstActivity的信息,设置其android:theme为“welcomeTheme”:

    ......
            <activity
                android:name=".FirstActivity"
                android:screenOrientation="portrait"
                android:theme="@style/welcomeTheme">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    ......
    

    进入FirstActivity中,去掉onCreate方法中的如下语句:

    //setContentView(R.layout.activity_first);
    

    在FirstActivity的onCreate方法中写一个多线程,尽情加载SDK啥的吧,然后加载完了,跳转到你的真正主界面,注意跳转需要取消掉动画效果:

    startActivity(new Intent(me, MainActivity.class));
    int version = Integer.valueOf(android.os.Build.VERSION.SDK);
    if (version > 5) {
         overridePendingTransition(0, 0);
    }
    finish();
    

    以上就是根据花哪儿记账这一项目开发过程中诞生的完整的启动优化实例解析,如果文中存在任何疑问欢迎在下边评论留言,如果这篇文章真的对你有帮助,欢迎收藏点赞和打赏。

    相关文章

      网友评论

          本文标题:启动优化·浅谈花哪儿记账在启动时的那些事

          本文链接:https://www.haomeiwen.com/subject/gmaqgttx.html