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(); } } в invoke поставете това: 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() и dismiss() са поставени в една и съща нишка.

person Nguyen Minh Binh    schedule 12.01.2012
comment
няма показвания. получаването на данни се извършва от Webservice / SOAP и следователно отнема време. - person Miguel Borges; 13.01.2012