如何避免启动前的黑屏?

4

我创建了一个带有背景和进度条的加载页面,当它完成加载时,会启动主类,但加载屏幕没有显示出来。在加载过程中,只是一个黑屏,然后才是主屏幕。我将所有工作放在onResume中,也尝试了onStart,但都没有成功。

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.loadpage);
    //get rid of title bar
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRequestedOrientation(1);

}

@Override
public void onResume() {
    super.onResume();

    words = WordList.sharedWordList(this);

    if(generatedLevels==null)
    {
        generatedLevels  = new ArrayList<PuzzleMZLen>();
    }
    if(!p.isAlive())
    {
        p.start();          
    }


    Intent i = new Intent(getApplicationContext(), Main.class);
    startActivity(i);

}

非常感谢您的提前帮助。

不相关 - 你确定要在onResume()方法中调用super.onStart()吗? - Noah
如果R.layout.loadpage是黑色的,那么XML是什么?我认为只需要更改背景。 - PedroAGSantos
@sqrfv 我只是忘记改了。发生了同样的事情。 - Robin
@subspider - loadpage有一个图片背景和进度条。 - Robin
3个回答

8
您需要使用AsyncTask 完成这种工作。您的布局将在加载完成后填充。因此,您将看到黑屏。

使用AsyncTask类的onPreExecute来显示进度条。并将加载代码写入doInBackground方法中。


3

一定要使用AsyncTask来完成这个任务。我在我的应用程序中也有同样的情况,以下是我的代码:

private class getAllData extends AsyncTask<Context, Void, Cursor> {
    protected void onPreExecute () {
        dialog = ProgressDialog.show(Directory.this, "", 
                "Loading. Please wait...", true);
    }

    @Override
    protected Cursor doInBackground(Context... params) {
        DirectoryTransaction.doDepts();

        return null;
    }

    protected void onPostExecute(Cursor c) {

        for(int i = 0 ; i < DeptResults.length ; i++){
            deptsAdapter.add(DeptResults[i][0]);            
        }
        dialog.dismiss();
    }
}

onPreExecute方法加载一个ProgressDialog,它只显示“正在加载,请稍等...”。doInBackground执行我的应用程序的加载工作(在我的情况下是从服务器获取和解析文本),然后onPostExecute填充一个spinner,然后取消ProgressDialog。对于进度条,您需要不同的东西,但AsyncTask将非常相似。使用new getAllData.execute(this);onCreate中调用。


谢谢这个。它帮了很多忙。 - Robin
我花了一些时间才让它按照我的需求工作,但其实并不难。可以查看Android开发文档中关于ProgressDialogs的内容。 - Rob

1

有一个好方法可以创建一个良好的启动画面。

为了防止ANR,您应该将所有数据加载移出UI线程,就像其他答案中提到的那样。请使用AsyncTask或任何其他类型的多线程来完成。

但是,为了消除在一些慢速设备上显示几秒钟的烦人的黑屏幕,您需要执行以下步骤:

  1. 创建bg_splash可绘制对象。它将在活动展示给用户时显示,而不是黑色背景。例如,它可以是品牌标志在品牌颜色背景上。
  2. 创建一个启动画面主题并将其放入/res/values/themes.xml中:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>   
        <style name="MyApp.Splash" parent="@style/Theme.Sherlock.Light.NoActionBar">
            <item name="android:windowBackground">@drawable/bg_splash</item>
        </style>
    </resources>
    
  3. 别忘了通过更新AndroidManifest.xml将创建的主题分配给启动画面活动:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp"
        android:versionCode="1"
        android:versionName="1" >
    
        ...
    
        <application>
            <activity
                android:name=".SplashActivity"
                android:theme="@style/MyApp.Splash" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            <activity>
            ...
        </application>
    </manifest>
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接