Android UI优化— App启动优化
原创
©著作权归作者所有:来自51CTO博客作者不死鸟jgc的原创作品,请联系作者获取转载授权,否则将追究法律责任
黑白屏产生的原因和解决办法
黑白屏产生的原因
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);
}
});
}