ProgressDialog не будет отображаться даже в onPreExecute AsyncTask

В моем классе Main расширяет Activity, у меня есть это:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
    case ...
    case CREDENTIAL_VIEW:
        new SetStatusProgressBar(this).execute();

И есть этот вложенный класс:

private class SetStatusProgressBar extends AsyncTask<String, Void, Boolean> {
    private ProgressDialog dialog;
    private Main ctx;

    public SetStatusProgressBar(Main ctx) {
        this.ctx = ctx;
        dialog = new ProgressDialog(ctx);
    }

    // progress dialog to show user that contacting server.
    protected void onPreExecute() {
        this.dialog = ProgressDialog.show(ctx, null,
                "Refreshing data from server...", true, false);
    }

    @Override
    protected void onPostExecute(final Boolean success) {
        //...
        //statements that refresh UI
        //...

        if (dialog.isShowing()) {
            dialog.dismiss();
            timerProgressBarStop();
        }
    }

    protected Boolean doInBackground(final String... args) {
        //...
        //statements to download data from server
        //...
        return true;
    }

}

В основном классе я открываю вторую активность таким образом:

Intent myIntent = new Intent(Main.this, Credentials.class);
startActivityForResult(myIntent, CREDENTIAL_VIEW);

Это второе действие возвращается к основному действию следующим образом:

Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();

Я не понимаю, почему, когда я перехожу от второго действия к основному, ProgressDialog будет отображаться ТОЛЬКО ПОСЛЕ обновления пользовательского интерфейса... Таким образом, диалоговое окно Progress остается на экране только полсекунды... а затем скрывается ! :( Я хотел бы видеть ProgressDialog наверху в течение всего времени загрузки!

Помоги пожалуйста. Спасибо вам всем


person Geltrude    schedule 15.02.2011    source источник
comment
Выполняете ли вы какие-либо другие операции внутри case CREDENTIAL_VIEW: после вызова new SetStatusProgressBar(this).execute();?   -  person dave.c    schedule 16.02.2011
comment
Вы начинаете второе действие после запуска диалогового окна прогресса? В этом случае причина будет скрыта, так как она выполняется в контексте файла Main. Попробуйте использовать контекст приложения. Или скройте прогресс перед запуском второго действия и покажите его снова, когда оно будет завершено.   -  person ackio    schedule 16.02.2011
comment
@ ackio: Нет, я не запускаю второе действие после запуска диалогового окна прогресса. Диалоговое окно прогресса запускается ТОЛЬКО при возврате второго действия.   -  person Geltrude    schedule 17.02.2011


Ответы (1)


Хорошо, прежде всего используйте getApplicationContext() вместо переменной ctx. Использование «это» не для хорошей памяти граждан. Попробуйте обновить progressDialog в методе onProgressUpdate(...).

person Lonkly    schedule 15.02.2011
comment
this и getApplicationContext() не совсем одно и то же. Также использование this (правильно) вообще не меняет объем памяти. - person Falmarri; 16.02.2011
comment
Ну, в этом случае есть 2 действия, и здесь может помочь использование getApplicationContext(), потому что нам не нужно строго привязывать его к контексту Credentials.class. - person Lonkly; 16.02.2011
comment
как я могу обновить progressDialog в onProgressUpdate(...)? Какой метод я должен вызвать? - person Geltrude; 17.02.2011
comment
Я думаю, что это возможно так: @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); если( !dialog.isShowing()){ диалог.show(); }} - person Lonkly; 17.02.2011
comment
Спасибо 4 ваша помощь, но не повезло. Я решил обходной путь: я переместил весь код с подключением к серверу во второй класс, прежде чем вернуться в основной (который теперь содержит только оператор для обновления пользовательского интерфейса). - person Geltrude; 17.02.2011