Прогресс Диалог по открытой деятельности - PullRequest
7 голосов
/ 23 ноября 2010

Эй, ребята, У меня проблема с диалогом прогресса при открытии деятельности (например, под названием «Деятельность 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, я вижу прогресс, но она не двигается и не чувствует, что у меня черный экран в течение 2 или 3 секунд, когда андроид показывает активность.

Если я выполняю этот код в OnCreate из Activity2 и если я заменяю showApps кодом на OnCreate, Activity1 останавливается на 2 секунды, я не вижу диалоговое окно прогресса и снова замораживаюсь на 2 секунды для действия 2, прежде чем увидеть результат.

Идея?

Ответы [ 4 ]

10 голосов
/ 11 января 2011

У меня была такая же проблема, и использование AsyncTask работает для меня.

Есть 3 важных метода для переопределения в AsyncTask.

  1. doInBackground : это место, где будет проходить фон вашей фоновой обработки.
  2. onPreExecute : показать ваш ProgressDialog здесь (showDialog)
  3. onPostExecute : скрыть ваш ProgressDialog здесь (removeDialog или dismissDialog)

Если вы сделаете свой подкласс AsyncTask внутренним классом своей деятельности, то вы можете вызывать каркасные методы showDialog, dismissDialog и removeDialog изнутриваша AsyncActivity.

Вот пример реализации AsyncTask:

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);
  }
}
3 голосов
/ 23 ноября 2010

GeeXor

Я бы посоветовал вам избегать выполнения большого количества операций в OnCreate в Деятельности 2. При написании большого количества операций в OnCreate возникает причина появления черного экрана между действиями. Поэтому выполняйте эти операции асинхронно, используя AsyncTask или в потоке (или запишите их в onStart , если они неизбежны).

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

2 голосов
/ 23 ноября 2010

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

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

0 голосов
/ 23 ноября 2010

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

...