Можно ли что-то отобразить до того, как основное действие завершится onCreate() в Android?

Учитывая приложение с одним действием как это:

public class MyActivity extends Activity {
  protected void onCreate(Bundle savedInstanceState) {

  loadingScreen = new RelativeLayout(this);
  // add a bitmap to loadingScreen
  setContentView(loadingScreen);

  Dict dict = new Dict();
  dict.init(); 
  // this method takes ~10 seconds 
  }
}

Теоретически, похоже, что при инициализации словаря будет отображаться экран загрузки. На практике ничего не отображается до onCreate() возвращается, поэтому пользователь видит пустой белый экран в течение 10 секунд. Каков наилучший способ отобразить, пожалуйста, подождите, пока это приложение загружает экран?

Я считаю, что я мог бы создать отдельную тему для dict.init(), но это кажется излишним в этом случае, потому что я не хочу, чтобы приложение было пригодным для использования или интерактивным dict.init() пробеги. Я бы хотел, чтобы он запускался в главном потоке (и зависал во время выполнения остальной части приложения), я просто хочу сначала что-то отобразить на экране.

PS, я пытался переехать dict.init() в onStart(), который, казалось, не имел никакого эффекта.

редактирование: возможно, мне следовало бы уточнить это, чтобы избежать получения ответов типа "Вы делаете неправильно", но инициализация занимает 2 или 3 секунды на современных телефонах и таблицах, 10 секунд - наихудший случай на старых телефонах. Это приложение представляет собой игру в слова, ее нельзя использовать без словаря. перемещение dict.init() асинхронная задача не улучшит работу пользователя, и я задал вопрос, возможно ли без заставки отобразить заставку. Я понимаю, что ответ "Нет"

1 ответ

Решение

Я бы хотел, чтобы он запускался в главном потоке (и зависал во время выполнения остальной части приложения)

Нет, нет, и ваши пользователи тоже не будут вам нравиться

Я полагаю, что мог бы создать отдельный поток для dict.init(), но в этом случае это кажется излишним, потому что я не хочу, чтобы приложение было пригодным для использования или интерактивным во время работы dict.init ().

Это именно то, что вы должны сделать. Вы можете использовать различные способы, включая AsyncTask и показать ProgressDialog пока работа ведется.

поэтому пользователь видит пустой белый экран в течение 10 секунд.

Если это займет так много времени, то вы можете пересмотреть свой поток. Даже если вы идете с отдельным Thread и показать ProgressBarБольшинство пользователей не хотят смотреть на это в течение 10 секунд. Вы должны загрузить данные в фоновом режиме и позволить им делать что-то еще во время загрузки, если это возможно. Вы можете использовать что-то вроде IntentService в зависимости от того, как вы получаете данные.

Пример AsyncTask

Безболезненная нить

Другие вопросы по тегам