Autore Topic: ProgressDialog e sua visualizzazione  (Letto 597 volte)

Offline csette

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Apple OSX
ProgressDialog e sua visualizzazione
« il: 02 Febbraio 2011, 10:11:07 CET »
0
Ciao a tutti sono appena iscritto e vi sottopongo subito un problema che sto affrontando nello sviluppo della mia prima applicazione per Android.
Sto cercando di visualizzare una ProgressDialog alla pressione di un buttone. In pratica alla pressione di questo bottone viene scatenata una chiamata Http e la ProgressDialog servirebbe per indicare che c'è un tempo di attesa per l'utente. Alla ricezione della risposta dovrei rimuovere la Dialog ma non ci riesco ovvero inserendo la chiamta showDialog(id) e la removeDialog(id) succede che la Dialog non viene visualizzata mentre se inserisco solo la showDialog tutto funziona correttamente ma la Dialog rimane visibile anche a fine chiamata Http. Allego la struttura della Activity.

Grazie in anticipo a coloro che mi vorranno aiutare.

Carlo

Codice (Java): [Seleziona]
public class PrimaActivity extends Activity {
       

    private static final int DIALOG1_KEY = 0;
    private static final int DIALOG2_KEY = 1;
       
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);    


        Button pressbutton = (Button)findViewById(R.id.LoginButton);        

       
               
        // Esegue il login!!
        pressbutton.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View view) {
                               
                                showDialog(DIALOG2_KEY);
                               
                                HttpClient client = new DefaultHttpClient();
                                HttpGet request = new HttpGet();
                               
                                                       
                       
                                try {

                                        String serviceURL="http://www.miaurl.it/test.php";
                                       
                                        request.setURI(new URI(serviceURL));
                                       
                                        HttpResponse response = client.execute(request);
                                        InputStream entity=response.getEntity().getContent();
                                        …..
                                        // recupero la risposta….etc                                 
                                        …..
                                       

                                        removeDialog(DIALOG2_KEY);
                                        Intent myIntent = new Intent(view.getContext(), SecondaActivity.class);
                                startActivityForResult(myIntent, 0);
                                } catch (Throwable e) {
                                        ……
                                }
                               
                               
                        }
                });
    }
   
    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case DIALOG1_KEY: {
                ProgressDialog dialog = new ProgressDialog(this);
                dialog.setTitle("Indeterminate");
                dialog.setMessage("Please wait while loading...");
                dialog.setIndeterminate(true);
                dialog.setCancelable(true);
                return dialog;
            }
            case DIALOG2_KEY: {
                ProgressDialog dialog = new ProgressDialog(this);
                dialog.setMessage("Please wait while loading......");
                dialog.setIndeterminate(true);
                dialog.setCancelable(true);
                return dialog;
            }
        }
        return null;
    }
   
}

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:ProgressDialog e sua visualizzazione
« Risposta #1 il: 02 Febbraio 2011, 10:37:03 CET »
0
Prima di scendere nel dettaglio della Dialog, c'è una considerazione di primaria importanza da fare. Il codice che hai scritto in linea teorica va bene per una prova, probabilmente funziona correttamente, ma nella pratica non si deve fare così. Ora mi spiego meglio.

Tu hai messo tutte le operazioni di recupero dalla rete e processazione risposta nel thread della UI. Il codice viene compilato ed eseguito, però è fortemente a rischio di Force Close, perchè il sistema Android uccide l'applicazione se il thread di UI rimane bloccato in qualche operazione per più di 5 secondi. Il modo corretto di implementare una tale funzionalità è demandare le operazioni temporalmente costose ad un thread parallelo che poi avvisa la UI quando ha finito.

Trovi un'implementazione dimostrativa della funzionalità che ti serve (fetch dalla rete, processazione risposta e progress dialog) qua:
[facile] HttpBookSearch: AsyncTask, HttpClient, XML parsing, ProgressDialog - Android Developers Italia
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:ProgressDialog e sua visualizzazione
« Risposta #2 il: 02 Febbraio 2011, 10:43:27 CET »
+1
Il tuo è un problema architetturale.  :-o

Il fatto che tu non riesca a visualizzare la dialog e a toglierla è semplicemente dovuto al fatto che fai tutto in momenti errati.

Che dir se ne dica "showDialog" non visualizza una dialog ma fa una richiesta di visualizzazione!  :-o

In particolare la richiesta viene fatta dal thread UI... il problema è che tu ti trovi già nel thread UI. Quindi se prima il thread UI non finisce quello che sta facendo, la tua dialog non verrà mai visualizzata.

Mi spiego meglio e spero in modo più semplice.

Appena premi il pulsante viene intercettato dal framework un evento. L'evento viene gestito dal thread UI che esegue il codice dentro "onClick(View view)". Ecco quello che accade:

showDialog(DIALOG2_KEY); // Viene fatta la richiesta di visualizzazione della dialog con id DIALOG2_KEY (MA NON VIENE VISUALIZZATA!!!)
HttpResponse response = client.execute(request); // Avviene la chiamata http, a sta facendo sempre il thread UI che resta in attesa della risposta
// recupero la risposta….etc
removeDialog(DIALOG2_KEY); // Viene fatta la richiesta di non visualizzare la dialog con id DIALOG2_KEY (MA NON E' MAI STATA VISUALIZZATA!!!)
startActivityForResult(myIntent, 0); // Viene fatta la richiesta per avviare una nuova activity

A questo punto avviene il processo per lo smistamento degli eventi scaturiti (l'ordine non è quello che scrivo adesso, ma si avvicina molto):
Processo per la visualizzazione delle dialog richieste: Viene visualizzata la dialog DIALOG2_KEY
Processo per la chiusura delle dialog richieste: Viene chiusa la dialog DIALOG2_KEY
Processo per l'avvio delle activity: Parte la nuova activity.

Ecco perché la tua dialog non viene vista.

Soluzione su cosa fare? Leggere!
Eccoti i link:
Designing for Responsiveness | Android Developers
Common Tasks and How to Do Them in Android | Android Developers
AsyncTask | Android Developers

Buono studio!

Offline csette

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Apple OSX
Re:ProgressDialog e sua visualizzazione
« Risposta #3 il: 02 Febbraio 2011, 10:48:59 CET »
0
Ciao Marco, ti ringrazio per la rapida e precisa risposta. Sei stato molto chiaro. Ed hai confermato il dubbio che avevo. Purtroppo mi trovo nella situazione di dover presentare un prototipo in poco tempo e non avendo delle solide basi di Android incappo in questi problemi.

Grazie molte e scusate per il disturbo.

Carlo

Offline csette

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Apple OSX
Re:ProgressDialog e sua visualizzazione
« Risposta #4 il: 02 Febbraio 2011, 11:59:02 CET »
0
Ciao,

grazie ai preziosi consigli di Marco ho risolto rapidamente ed in modo indolore  :-)
Ho implementato l'AsyncTask come suggerito ed ora tutto funziona a meraviglia.

Allego una porzione di codice e considero a sto punto risolto.

Codice (Java): [Seleziona]
private class DoLoginTask  extends AsyncTask<URI, Integer, String>{


                @Override
                protected String doInBackground(URI... urls) {

                        // chiamata Http
                       
                }
               
               

               
                @Override
                protected void onPreExecute() {
                        // mostra la dialog
                }
               
                @Override
                protected void onPostExecute(String result) {
                        // rimuove la dialog
                       
                }


        }