Autore Topic: ProgressDialog: come funziona  (Letto 1187 volte)

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
ProgressDialog: come funziona
« il: 31 Marzo 2011, 12:51:16 CEST »
0
Salve a tutti, per una mia applicazione ho bisogno di fare una ProgressDialog: ad un certo punto devo spedire alcuni dati ad un server che, appena finita l'operazione di salvataggio mi rispondera' con un booleano. Io vorrei che in questo lasso di tempo venisse visualizzata una semplice progress dialog con un messaggio. Sto' provando a crearne una semplicissima in questo modo:
Codice (Java): [Seleziona]
...
ProgressDialog pd;
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.conferma);
               
                Button salva = (Button) findViewById(R.id.salvadati);
                salva.setOnClickListener(onSalva);
        }
private View.OnClickListener onSalva = new OnClickListener() {
               
                @Override
                public void onClick(View v) {
                        // TODO Auto-generated method stub
                       
                        pd = ProgressDialog.show(nomeActivity.this, "Attendere!", "Sto' salvando...");
                       
                        salvaDati();
                }
        };
...

Il problema e' che l'applicazione va' in crash e non riesco a capire cosa succeda! Nel logcat non compare nulla e eclipse cerca di aprire una debug perspective... C'e' qualcosa che sbaglio nel creare il ProgressDialog che mi sfugge?
Per completezza aggiungo il codice xml anche se non dovrebbe essere quello il problema (credo!).
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 
  <Button android:id="@+id/salvadati"
                        android:text="Salva"
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                />
</LinearLayout>

Non riesco proprio a capire cosa non vada!
Risparmia l'acqua, bevi birra...

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:ProgressDialog: come funziona
« Risposta #1 il: 31 Marzo 2011, 12:54:01 CEST »
0
prova con:
pd = ProgressDialog.show(nomeActivity.this, "Attendere!", "Sto' salvando...",true);
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:ProgressDialog: come funziona
« Risposta #2 il: 31 Marzo 2011, 13:51:47 CEST »
0
Avevo gia' provato, non era quello.
Risparmia l'acqua, bevi birra...

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:ProgressDialog: come funziona
« Risposta #3 il: 31 Marzo 2011, 14:15:34 CEST »
0
Non so' che dire... Ora va', senza aver cambiato il codice! Ho solo chiuso l'emulatore e fatto ripartire... Mamma mia che fastidio quando fa' cosi'!!!
Risparmia l'acqua, bevi birra...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ProgressDialog: come funziona
« Risposta #4 il: 31 Marzo 2011, 16:02:04 CEST »
0
Se il tuo lavoro blocca il main thread la tua progress dialog non verra' visualizzata. Usa un thread separato.

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:ProgressDialog: come funziona
« Risposta #5 il: 31 Marzo 2011, 16:24:16 CEST »
0
In che senso il mio lavoro blocca il main thread? Quello che fa' la mia applicazione e' inviare una stringa json ad un server e questo rispondera' con una stringa. Quello che voglio io e' che in questo frattempo si visualizzi la finestra. Tu dici che dovrei fare un thread che effettua il salvataggio? Ma questa e' l'unica soluzione possibile? Perche' voglio mantenere l'applicazione single thread.
Risparmia l'acqua, bevi birra...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: ProgressDialog: come funziona
« Risposta #6 il: 31 Marzo 2011, 20:40:12 CEST »
0
Non devi! Operazioni come chiamate http devono essere necessariamente eseguite in un thread separato. ;)

Sent from my HTC Desire

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:ProgressDialog: come funziona
« Risposta #7 il: 01 Aprile 2011, 09:42:32 CEST »
0
Si, lo so che e' buona norma fare come dici tu, ma quello che chiedo e' se e' necessario fare in questo modo! Nel senso, non c'e' altro modo se non quello del thread separato?
Risparmia l'acqua, bevi birra...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: Re:ProgressDialog: come funziona
« Risposta #8 il: 01 Aprile 2011, 09:57:26 CEST »
0
Si, lo so che e' buona norma fare come dici tu, ma quello che chiedo e' se e' necessario fare in questo modo! Nel senso, non c'e' altro modo se non quello del thread separato?

Se vuoi fare un programma stabile e veloce non c'è altro modo.

Sent from my HTC Desire

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:ProgressDialog: come funziona
« Risposta #9 il: 01 Aprile 2011, 10:15:29 CEST »
0
Per quello che e' lo scopo della mia applicazione non ci sarebbe particolare vantaggio, ne in termini di velocita' ne in termini di stabilita', anzi, probabilmente le complicazioni dovute al modello multithread rischierebbero solo di aggiungere problemi. L'applicazione che devo fare non ha particolari requisiti di velocita' da rispettare, dunque uno o due secondi di attesa dell'utente non danno alcun problema. Oltretutto, se il salvataggio sul server non dovesse riuscire salverei su un file in locale, senza quindi fare differenza per il punto di vista dell'utente. Passerei ad un modello multithread solo ed esclusivamente se fosse l'unica soluzione praticabile.
Spiego meglio quello che dovrebbe essere il funzionamento:
Ho dei dati da salvare in server
- controllo se c'e' rete disponibile
      - se no salvo direttamente su file locale e do' conferma all'utente
      - se si mando i dati al server
- spedisco i dati al server
      - se non mi risponde entro un lasso di tempo salvo su file locale e do' conferma all'utente
      - se mi risponde controllo la risposta mi muovo di conseguenza
Risparmia l'acqua, bevi birra...

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: come funziona
« Risposta #10 il: 01 Aprile 2011, 10:37:54 CEST »
0
Per quello che e' lo scopo della mia applicazione non ci sarebbe particolare vantaggio, ne in termini di velocita' ne in termini di stabilita', anzi, probabilmente le complicazioni dovute al modello multithread rischierebbero solo di aggiungere problemi.
...
Passerei ad un modello multithread solo ed esclusivamente se fosse l'unica soluzione praticabile.

Non è per una forma di integralismo informatico che ti consigliano di non fare come dici. E' perchè una delle regole principali dello sviluppo Android è proprio non sovraccaricare il main thread (il thread della UI). E non è una opzione, è un vincolo della piattaforma: se la tua richiesta HTTP non termina entro 10 secondi, l'applicazione viene chiusa da Android e all'utente appare come un crash.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: ProgressDialog: come funziona
« Risposta #11 il: 01 Aprile 2011, 10:44:16 CEST »
0
Forse questa lettura potrebbe schiarirti le idee:

 http://developer.android.com/guide/practices/design/responsiveness.html

Se poi non hai voglia di copiare da internet 10 righe di codice che ti permettono di fare le tue operazioni in un background thread fai come preferisci ;)

Sent from my HTC Desire

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:ProgressDialog: come funziona
« Risposta #12 il: 01 Aprile 2011, 10:47:58 CEST »
0
Grazie mille! Ho capito, in pratica sono obbligato dunque. Il mio problema nasce dal fatto che molte volte viene imposto il multithreading come forma elegante per risolvere problemi, mentre secondo me per situazioni semplici aggiunge solo complicazioni e aumenta i punti possibili per i bug senza dare particolari vantaggi concreti (naturalmente dipende da quello che si deve fare!).
Quindi insomma la soluzione sarebbe far partire un altro thread che fa' la richiesta http e nel principale far andare la ProgressDialog in attesa della risposta... Vi ringrazio per la disponibilita' e la chiarezza. :)

Ho visto ora la tua risposta Ricky, non si tratta di un problema di voglia, solo di non volere aggiungere situazioni di potenziali problemi! ;) Grazie mille ancora, adesso gli do' uno sguardo.
Risparmia l'acqua, bevi birra...

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:ProgressDialog: come funziona
« Risposta #13 il: 01 Aprile 2011, 13:12:50 CEST »
0
Grazie mille! Ho capito, in pratica sono obbligato dunque. Il mio problema nasce dal fatto che molte volte viene imposto il multithreading come forma elegante per risolvere problemi, mentre secondo me per situazioni semplici aggiunge solo complicazioni e aumenta i punti possibili per i bug senza dare particolari vantaggi concreti (naturalmente dipende da quello che si deve fare!).
Quindi insomma la soluzione sarebbe far partire un altro thread che fa' la richiesta http e nel principale far andare la ProgressDialog in attesa della risposta... Vi ringrazio per la disponibilita' e la chiarezza. :)

Ho visto ora la tua risposta Ricky, non si tratta di un problema di voglia, solo di non volere aggiungere situazioni di potenziali problemi! ;) Grazie mille ancora, adesso gli do' uno sguardo.
sinceramente, non vedo dove possono aumentare i problemi! se fai le cose come si deve, non cambia niente rispetto a fare tutto in un thread.
Se non vuoi fare un thread, quindi handler ecc, valuta l'utilizzo di un asynctask, che nel tuo caso forse è piu utile...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia