Диалог прогресса на открытой деятельности

StackOverflow https://stackoverflow.com/questions/4254139

  •  27-09-2019
  •  | 
  •  

Вопрос

Эй, ребята, у меня проблема с диалоговым окном прогресса на открытии деятельности (называемая деятельностью 2 в примере). Упражнение 2 имеет много кода для выполнения в этом событии Oncreate.

final ProgressDialog myProgressDialog = ProgressDialog.show(MyApp.this,getString(R.string.lstAppWait), getString(R.string.lstAppLoading), true);
new Thread() {
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                showApps();
            }
        });
        myProgressDialog.dismiss();
    }
}.start(); 

Функция ShowApps начнется активность 2.

Если я выполняю этот код на мою кнопку, нажмите событие на активность 1, я вижу прогресс, но она не двигается, но она не перемещается, и в Afeter есть черный экран в течение 2 или 3 секунды времени для Android, чтобы показать активность.

Если я выполню этот код в OnCreate Of Aification2, и если я заменил ShowApps по коду на OnCreate, Aificate1 Freeze 2 секунды, я не вижу диалоговое окно прогресса и замораживаю еще 2 секунды на активности 2, прежде чем видеть результат.

Идея ?

Это было полезно?

Решение

У меня была такая же проблема и используя Асинктюз работает для меня.

Существует 3 важных метода переопределения в асинктюз.

  1. Doinbackground : Это где произойдет мясо вашего фона.
  2. onPreexecute : Покажите свой ProgressDialog здесь (ShowDialog)
  3. OnPostexecute : Скрыть свой ProgressDialog здесь (удаление или увольнение)

Если вы делаете подкласс Asynctask в качестве внутреннего класса вашей активности, вы можете позвонить в рамках методов ShowDialog, увольнение и удаление в пределах вашей асинаксической активности.

Вот образец реализации асинктюды:

class LoginProgressTask extends AsyncTask<String, Integer, Boolean> {
  @Override
  protected Boolean doInBackground(String... params) {
    try {
      Thread.sleep(4000);  // Do your real work here
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return Boolean.TRUE;   // Return your real result here
  }
  @Override
  protected void onPreExecute() {
    showDialog(AUTHORIZING_DIALOG);
  }
  @Override
  protected void onPostExecute(Boolean result) {
    // result is the value returned from doInBackground
    removeDialog(AUTHORIZING_DIALOG);
    Intent i = new Intent(HelloAndroid.this, LandingActivity.class);
    startActivity(i);
  }
}

Другие советы

AFAIK Вы не можете предварительно загрузить любую активность с отображенным диалоговом окна прогресса. Вы тестируете на реальном устройстве или в эмуляторе?

Я видел обходные пути, которые открывали активность с просмотром просмотра, имеющего анимацию прогресса в центре, а на следующем представлении было загружено активность, но это нее рекомендуется и трудно реализовать для работы по желанию.

Пожимание

Я бы предположил, чтобы вы избегали выполнения много операций в деятельности 2, находящиеся на операции. Написать много операций в Oncreate - это причина для черного экрана между мероприятиями .so выполнять эти операции асинхронно используя Асинктюз или в потоке (или напишите их в onstart. Если они неизбежны).

Другое предложение состоит в том, чтобы начать другой прогресс-кадр в активности 2, который будет работать, пока все ваши данные не будут загружены, и пользователь не будет знать, что что-то происходит в фоновом режиме.

Это то, что я бы сделал. Создайте обработчик в потоке пользовательских интернет-пользователей, начните фоновую поток обработки, а затем показать прогресс-файл. Когда фоновая нить закончила, это работает, получите его, чтобы опубликовать прогон для провода на нити UI через обработчик для отклонения диалогового окна.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top