Как избежать черного экрана перед запуском? - PullRequest
4 голосов
/ 22 июля 2011

Я создал страницу загрузки с фоном и индикатором выполнения, и когда он заканчивает загрузку, он запускает основной класс, но экран загрузки не отображается.Это просто черный экран во время загрузки, а затем основной экран.Я положил всю работу в 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);

}

заранее спасибо

Ответы [ 3 ]

8 голосов
/ 22 июля 2011

Вы должны использовать AsyncTask для этого вида работы. Ваш макет заполняется после завершения загрузки. Так что вы смотрите черный экран.

Используйте onPreExecute из AsyncTask класса, чтобы показать индикатор выполнения. И напишите код загрузки в методе doInBackground.

3 голосов
/ 22 июля 2011

Определенно используйте 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 заполняет счетчик, а затем закрывает ProgressDialog.Вы будете хотеть что-то другое для индикатора выполнения, но AsyncTask будет очень похожим.Звоните по номеру onCreate с новым getAllData.execute(this);

1 голос
/ 08 сентября 2013

Есть хороший способ создать хорошую всплывающую активность.

Чтобы предотвратить ANR, вы должны переместить всю загрузку данных за пределы потока пользовательского интерфейса, как было упомянуто в других ответах.Пожалуйста, используйте AsyncTask или любой другой вид многопоточности для этого.

Однако для удаления надоедливого черного экрана, который на несколько минут показывает на некоторых медленных устройствах, вам нужно выполнить следующие шаги:

  1. Создать bg_splash Drawable.Он будет отображаться вместо черного фона как раз во время активности пользователя.Например, это может быть логотип бренда на цветном фоне бренда.
  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. Donне забудьте назначить созданную тему для всплеска активности путем обновления 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>
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...