Как избежать черного экрана перед запуском?

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

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

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

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

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

Существует хороший способ создания хорошей всплеской активности.

Чтобы предотвратить ANR, вы должны переместить всю загрузку данных за пределы потока пользовательского интерфейса, как было упомянуто в других ответах. Для этого используйте 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>