黑白屏产生的原因和解决办法
黑白屏产生的原因
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的布局如下:
<? version=\"1.0\" encoding=\"utf-8\"?>
<RelativeLayout ns:android=\"http://schemas.android.com/apk/res/android\"
ns: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
< Layout
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);
}
});
}
继续阅读与本文标签相同的文章
围棋人机大战一周年:被AlphaGo改变的世界
这项技术可以合成以假乱真的奥巴马视频
-
88%中国员工相信AI超过经理 人见多了就更喜欢狗?
2026-05-18栏目: 教程
-
删库不要跑,我站起来还可以删
2026-05-18栏目: 教程
-
拼硬件真过时了?卡萨帝冰箱乌镇全讲场景
2026-05-18栏目: 教程
-
哈弗F7有AI更便捷 全球最流行的交互方式了解一下
2026-05-18栏目: 教程
-
浙江移动成今年世界互联网大会高级合作伙伴
2026-05-18栏目: 教程
