ProgressDialog не отображается в Android

Я пытаюсь, чтобы ProgressDialog появлялся, когда я получаю некоторые данные в Activity. Активность работает нормально, и данные получены, но ProgressDialog не появляется.

 private void updateData() {
        ProgressDialog dialog = ProgressDialog.show(ParkActivity.this, "fvhnn", "A actualizar. Aguarde por favor...", true);
        ...
        ...
        dialog.dismiss();
        ...
 }

следуйте коду моей деятельности.

public class ParkActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set View to register.xml
        setContentView(R.layout.park);

        SharedPreferences settings = getSharedPreferences(PREF_FILE, 0);
        int ocupados = settings.getInt("ocupados", -1);

        if(ocupados == -1) {
            ((TextView) findViewById(R.id.txtPercentageOcupation)).setVisibility(View.INVISIBLE);
            ((TextView) findViewById(R.id.txtLastUpdate)).setVisibility(View.INVISIBLE);
            ((TextView) findViewById(R.id.txtPlacesAvailable)).setVisibility(View.INVISIBLE);
            ((Button) findViewById(R.id.btnParkUpdate)).setVisibility(View.INVISIBLE);

            updateData();
        } else {
            int total = settings.getInt("total", 440);
            long data = settings.getLong("data", 0);

            putData(ocupados, total, data);
        }


        Button btnUpdate = (Button) findViewById(R.id.btnParkUpdate);
        btnUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                updateData();
            }
        });
    }

    private void updateData() {
        ProgressDialog dialog = ProgressDialog.show(ParkActivity.this, "fvhnn", "A actualizar. Aguarde por favor...", true);
        SharedPreferences settings = getSharedPreferences(PREF_FILE, 0);
        String session = settings.getString("sessionID", "null");
        int[] vagas = ISEP_Proxy.vagas(session);
        Date dt = new Date();
        putData(vagas[0], vagas[1], dt.getTime());
        dialog.dismiss();

        // save data
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt("ocupados", vagas[0]);
        editor.putInt("total", vagas[1]);
        editor.putLong("data", dt.getTime());

        editor.commit();
    }

    private void putData(int ocupados, int total, long date) {
        String placesFormat = getResources().getString(R.string.PLACES_AVAILABLE);
        String percentageFormat = getResources().getString(R.string.PERCENTAGE_OCUPATION);
        String lastUpdate = getResources().getString(R.string.LAST_UPDATE);
        double percentage =  100.0 * ocupados / total;

        SimpleDateFormat df = new SimpleDateFormat("HH'h'mm 'de' dd-MM-yyyy");

        ((TextView) findViewById(R.id.txtPercentageOcupation)).setVisibility(View.VISIBLE);
        ((TextView) findViewById(R.id.txtLastUpdate)).setVisibility(View.VISIBLE);
        ((TextView) findViewById(R.id.txtPlacesAvailable)).setVisibility(View.VISIBLE);
        ((Button) findViewById(R.id.btnParkUpdate)).setVisibility(View.VISIBLE);

        ((TextView) findViewById(R.id.txtPercentageOcupation)).setText(String.format(percentageFormat, ((int) percentage) + "%"));
        ((TextView) findViewById(R.id.txtPlacesAvailable)).setText(String.format(placesFormat, total - ocupados));
        ((TextView) findViewById(R.id.txtLastUpdate)).setText(String.format(lastUpdate, df.format(date)));
    }
}

Кто-нибудь знает, в чем проблема?


РЕДАКТИРОВАТЬ

@Ted Hopp Предложите использовать AsyncTask. Я создал класс GetISEPData и поместил его внутрь диалога, но теперь приложение выдает ошибку и закрывается.

private class GetISEPData extends AsyncTask<Void, Void, Void> {
    Context cx;
    ProgressDialog dialog;

    public GetISEPData (Context context) {
        cx = context;
    }

    @Override
    protected Void doInBackground(Void... params) {
        SharedPreferences settings = getSharedPreferences(PREF_FILE, 0);
        String session = settings.getString("sessionID", "null");
        int[] vagas = ISEP_Proxy.vagas(session);
        Date dt = new Date();
        putData(vagas[0], vagas[1], dt.getTime());

        // save data
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt("ocupados", vagas[0]);
        editor.putInt("total", vagas[1]);
        editor.putLong("data", dt.getTime());

        editor.commit();            
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        dialog = ProgressDialog.show(ParkActivity.this, "", "A actualizar. Aguarde por favor...", true);
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        dialog.dismiss();
    }       
}

для вызова поместите это:

    Button btnUpdate = (Button) findViewById(R.id.btnParkUpdate);
    btnUpdate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            new GetISEPData(ParkActivity.this).execute();
        }
    });

person Miguel Borges    schedule 12.01.2012    source источник
comment
возможный дубликат ProgressDialog не отображается   -  person Mat    schedule 12.01.2012


Ответы (2)


Между вызовом show() и вызовом dismiss() вам нужно выполнить работу в отдельном потоке. Пока вы не вернете управление фреймворку, у диалогового окна не будет возможности отрисоваться. Взгляните на AsyncTask, чтобы узнать, как это сделать.

РЕДАКТИРОВАТЬ: в вашей обновленной версии вашего кода у вас есть логика для onPreExecute и onPostExecute в обратном порядке - вы пытаетесь закрыть диалоговое окно до его отображения!

person Ted Hopp    schedule 12.01.2012
comment
Спасибо за ответ. Я создал класс GetISEPData и поместил его в диалоговое окно, но теперь приложение выдает ошибку и закрывается. private class GetISEPData extends AsyncTask<Void, Void, Void> { Context cx; ProgressDialog dialog; public GetISEPData (Context context) { cx = context; } @Override protected Void doInBackground(Void... params) { int[] vagas = ISEP_Proxy.vagas(session); Date dt = new Date(); putData(vagas[0], vagas[1], dt.getTime()); } - person Miguel Borges; 12.01.2012
comment
@Override protected void onPostExecute(Void result) { super.onPostExecute(result); dialog = ProgressDialog.show(ParkActivity.this, "", "A actualizar. Aguarde por favor...", true); } @Override protected void onPreExecute() { super.onPreExecute(); dialog.dismiss(); } } в вызове поместите это: Button btnUpdate = (Button) findViewById(R.id.btnParkUpdate); btnUpdate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { new GetISEPData(ParkActivity.this).execute(); } }); - person Miguel Borges; 12.01.2012
comment
@MiguelBorges Невозможно прочитать код, вставленный в комментарии. Можете ли вы отредактировать свой исходный пост и добавить туда код? Кроме того, пожалуйста, опубликуйте подробности (трассировка стека) об ошибке. - person Ted Hopp; 12.01.2012
comment
ржу не могу. Спасибо. К тому времени я понял, что всякий раз, когда вы хотите реализовать ProcessDialog, AsyncTask должен реализовать его, верно? - person Miguel Borges; 13.01.2012
comment
@MiguelBorges Да. Для любой трудоемкой операции требуется рабочий поток. Хотя есть много способов сделать это, использование AsyncTask — один из самых простых. - person Ted Hopp; 13.01.2012

Я думаю, что он показан, но он также немедленно отклонен, потому что методы show() и reject() помещаются в один и тот же поток.

person Nguyen Minh Binh    schedule 12.01.2012
comment
нет шоу. получение данных осуществляется Webservice/SOAP, поэтому требует времени. - person Miguel Borges; 13.01.2012