CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: 9mm con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: elmegio con ben 7 Thanks ricevuti negli ultimi sette giorni
Utente del mese: bluemask con ben 43 Thanks ricevuti nell'ultimo mese

Pagina 1 di 2 12 ultimoultimo
Ultima pagina
Visualizzazione dei risultati da 1 a 10 su 16
Discussione:

ProgressDialog & Threads...

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Baby Droid


    Registrato dal
    Feb 2010
    Località
    Fregene - Forte Dei Marmi
    Messaggi
    46

    Ringraziamenti
    9
    Ringraziato 0 volte in 0 Posts
    Predefinito

    ProgressDialog & Threads...

    ciao ragazzi...
    alla pressione di un bottone viene lanciato questo metodo:

    private void loginButtonClick(){
    Log.d(TAG, "Login");
    try{
    fc.login(getWifiIp());
    vibra();
    Toast toast = Toast.makeText(
    this,
    R.string.login_successful,
    Toast.LENGTH_SHORT
    );
    toast.show();
    }catch(LoginException e){
    Log.e(TAG, e.getMessage());
    vibra();
    Toast toast = Toast.makeText(
    this,
    R.string.login_error,
    Toast.LENGTH_SHORT
    );
    toast.show();
    }
    }

    vorrei "threadizzare" quello che accade qui (soprattutto il metodo fc.login(getWifiIp()) ) per poter utilizzare una ProgressDialog (di tipo indeterminate, penso).
    fc è di tipo FacadeController, singleton (ho il metodo statico FacadeController getInstance() ) mentre il metodo login(String ip) fa una post ad un sito web(richiamando un metodo statico in un'altra classe).
    non ho mai scritto classi runnable o thread, non saprei dove cominciare (conosco la teoria dei threads, ma nemmeno in maniera sufficiente)...
    mi basta dare un feedback di "funzionamento" (dato che il login prende possesso delle risorse e sembra sia tutto "impallato", ed il server a cui si fa il login e abbastanza lento...)

    grazie
    Michele
    Ultima modifica di Andrea; 11-03-10 alle 15:57

  2.  
  3. #2
    Administrator L'avatar di Andrea


    Registrato dal
    Nov 2008
    Messaggi
    3,368
    Smartphone
    Nexus S, myTouch Slide 4g

    Ringraziamenti
    143
    Ringraziato 880 volte in 323 Posts
    Predefinito

    Ci sono due metodi per fare questo.

    1. Usare l'oggetto Handler
    2. Usare runOnUiThread della classe Thread.


    Sinceramente preferisco l'utilizzo di un handler. Lo trovo molto piu pulito e corretto.

    Prima di tutto Crea un oggetto di tipo ProgressDialog che sia accessibile in modo privato dalla tua Activity/Classe


    private ProgressDialog myPd;


    A questo punto creiamo il nostro handler che avrà come obiettivo ricevere delle informazioni dal thread ed eventualmente modificare la nostra ui



    private Handler loginHandler = new Handler( ){
    public void handleMessage(Message msg) {
    /* salva la configurazione */
    myPd.dismiss();
    if (msg.what==1) {
    // Tutto ok
    vibra();
    Toast toast = Toast.makeText(
    this,
    R.string.login_successful,
    Toast.LENGTH_SHORT
    );
    toast.show();
    } else {

    //Qualcosa è andato storto
    vibra();
    Toast toast = Toast.makeText(
    this,
    R.string.login_error,
    Toast.LENGTH_SHORT
    );
    toast.show();
    }
    }
    };


    Come potrai notare all'interno di loginHandler chiamo myPd.dismiss() che noin fa altro che chiudere il progressDialog.

    Inoltre ho spostato i toast e la chiamata a vibra dentro all'handler poichè concettualmente più corretto che lasciarlo dentro al thread.

    Perciò vediamo come dovrebbe essere modificata la tua loginButtonClick per far andare fc.login all'interno di un thread.


    private void loginButtonClick(){
    myPd = ProgressDialog.show((Context)this, "Login" , "Login in corso!",true);
    new Thread(new Runnable() {

    @Override
    public void run() {
    // TODO Auto-generated method stub
    try{
    fc.login(getWifiIp());
    //Tutto ok
    loginHandler.sendEmptyMessage(1);
    }catch(LoginException e){
    Log.e(TAG, e.getMessage());
    // E' andato storto
    loginHandler.sendEmptyMessage(0);
    }
    }
    });
    }


    Come puoi vedere chiamo loginHandler.sendEmptyMessage con 0 o 1 ... Quel parametro è il msg.what utilizzato all'interno dell'handler visto sopra.

    Spero di essere stato chiaro e di averti aiutato abbastanza.

    Saluti, Andrea

    Twitter @veke87

  4. Il seguente Utente ha ringraziato Andrea per il post:

    BobArctor (12-03-10)

  5. #3
    Baby Droid


    Registrato dal
    Feb 2010
    Località
    Fregene - Forte Dei Marmi
    Messaggi
    46

    Ringraziamenti
    9
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Ciao!!!
    accidenti, mi hai chiarito davvero tutto!!!
    Grazie!!!
    quindi, l'handler è questo:
    codice:
    private Handler loginHandler = new Handler(){
        		@Override
        		public void handleMessage(Message msg){
        			myPd.dismiss();
        			if (msg.what==1){
        				vibra();
        				Toast toast = Toast.makeText(
        						Main.this,
        						R.string.login_successful,
        						Toast.LENGTH_SHORT
        				);
        				toast.show();
        			}else{
        				vibra();
        				Toast toast = Toast.makeText(
        						Main.this,
        						R.string.login_error,
        						Toast.LENGTH_SHORT
        				);
        				toast.show();
        			}
        		}
        };
    mentre il thread di "login" è:
    codice:
        private void loginButtonClick(){
        	myPd.setMessage(getResources().getString(R.string.login_progress));
        	myPd.show();
        	new Thread(new Runnable(){
        		@Override
        		public void run(){
        			try{
        				fc.login(getWifiIp());
        				loginHandler.sendEmptyMessage(1);
        			} catch(LoginException e){
        				Log.e(TAG,"LoginException: ");
        				loginHandler.sendEmptyMessage(0);
        			}
        		}
        	}).start();
        }
    naturalmente c'è la variabile d'istanza myPd in testa al codice:
    codice:
    private ProgressDialog myPd;
    ultimissimo chiarimento:
    io imposto il messaggio di myPd all'interno del metodo loginButtonClick().
    ho anche il metodo logoutButtonClick(), praticamente uguale. E' più corretto utilizzare 2 riferimenti diversi (myPdLogin e myPdLogout) oppure va bene così, settandogli semplicemente il messaggio diverso?
    grazie ancora!

    Michele

  6. #4
    Administrator L'avatar di Andrea


    Registrato dal
    Nov 2008
    Messaggi
    3,368
    Smartphone
    Nexus S, myTouch Slide 4g

    Ringraziamenti
    143
    Ringraziato 880 volte in 323 Posts
    Predefinito

    In realtà puoi usare lo stesso myPd . Io solitamente uso un'istanza unica. Ma se te ne servono due usane due

    Twitter @veke87

  7. #5
    Baby Droid


    Registrato dal
    Feb 2010
    Località
    Fregene - Forte Dei Marmi
    Messaggi
    46

    Ringraziamenti
    9
    Ringraziato 0 volte in 0 Posts
    Predefinito

    perfetto, grazie!

  8. #6
    Baby Droid


    Registrato dal
    Jun 2010
    Messaggi
    22

    Ringraziamenti
    2
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da Andrea Visualizza il messaggio
    Ci sono due metodi per fare questo.

    1. Usare l'oggetto Handler
    2. Usare runOnUiThread della classe Thread.


    Sinceramente preferisco l'utilizzo di un handler. Lo trovo molto piu pulito e corretto.

    Prima di tutto Crea un oggetto di tipo ProgressDialog che sia accessibile in modo privato dalla tua Activity/Classe


    private ProgressDialog myPd;


    A questo punto creiamo il nostro handler che avrà come obiettivo ricevere delle informazioni dal thread ed eventualmente modificare la nostra ui



    private Handler loginHandler = new Handler( ){
    public void handleMessage(Message msg) {
    /* salva la configurazione */
    myPd.dismiss();
    if (msg.what==1) {
    // Tutto ok
    vibra();
    Toast toast = Toast.makeText(
    this,
    R.string.login_successful,
    Toast.LENGTH_SHORT
    );
    toast.show();
    } else {

    //Qualcosa è andato storto
    vibra();
    Toast toast = Toast.makeText(
    this,
    R.string.login_error,
    Toast.LENGTH_SHORT
    );
    toast.show();
    }
    }
    };


    Come potrai notare all'interno di loginHandler chiamo myPd.dismiss() che noin fa altro che chiudere il progressDialog.

    Inoltre ho spostato i toast e la chiamata a vibra dentro all'handler poichè concettualmente più corretto che lasciarlo dentro al thread.

    Perciò vediamo come dovrebbe essere modificata la tua loginButtonClick per far andare fc.login all'interno di un thread.


    private void loginButtonClick(){
    myPd = ProgressDialog.show((Context)this, "Login" , "Login in corso!",true);
    new Thread(new Runnable() {

    @Override
    public void run() {
    // TODO Auto-generated method stub
    try{
    fc.login(getWifiIp());
    //Tutto ok
    loginHandler.sendEmptyMessage(1);
    }catch(LoginException e){
    Log.e(TAG, e.getMessage());
    // E' andato storto
    loginHandler.sendEmptyMessage(0);
    }
    }
    });
    }


    Come puoi vedere chiamo loginHandler.sendEmptyMessage con 0 o 1 ... Quel parametro è il msg.what utilizzato all'interno dell'handler visto sopra.

    Spero di essere stato chiaro e di averti aiutato abbastanza.

    Saluti, Andrea
    Salve, è molto utile ciò che hai scritto solo che a me non funziona......

    ho definito l'handler come hai fatto tu come campo della Activity



    poi nel metodo ho creato un ProgressDialog finestraAttesa e ho inglobato il metodo in cui durante la sua esecuzione deve far visualizzare il ProgressDialog



    Il mio problema è il seguente: La ProgressDialog si visualizza ma non si toglie e per lo più blocca il funzionamento del mio metodo scarica...()

    Non esiste un modo più semplice come un componente in cui si possa direttamente chiamare show per visualizzar la Dialog e dopo il metodo chiamare dismiss per toglierlo?

    L'ho provato con la ProgressDialog ma non la visualizza proprio.

  9. #7
    Baby Droid


    Registrato dal
    May 2011
    Messaggi
    25

    Ringraziamenti
    0
    Ringraziato 7 volte in 7 Posts
    Predefinito

    Fossi in te userei gli AsyncTask():

    AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
    Ti lascio un'esempio di implementazione:



    Puoi richiamare tutto ciò nella tua MainActivity in questo modo:

    Ultima modifica di androidlab; 01-06-11 alle 10:00

  10. Il seguente Utente ha ringraziato androidlab per il post:

    vavabigol (07-06-11)

  11. #8
    Baby Droid


    Registrato dal
    Jun 2010
    Messaggi
    22

    Ringraziamenti
    2
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da androidlab Visualizza il messaggio
    Fossi in te userei gli AsyncTask():



    Ti lascio un'esempio di implementazione:



    Puoi richiamare tutto ciò nella tua MainActivity in questo modo:

    Salve, grazie dell'aiuto.... funziona ma vorrei che al fine
    del lavoro si possa anche togliere la ProgressDialog.

    Mi sapreste dire come fare modificando questo codice precedente?

    Mi lancia una nullPointerException.

    Questo lo faccio nella classe che richiama la innerclass per visualizzare
    la finestra di attesa



    e questo codice come consigliato precedentemente



    Grazie per ogni aiuto anche perché ho provato 1000 modi per usare
    una ProgressDialog ma non ho mai avuto successo....

    inizio a pensare che non ci riuscirò.... spero qualcuno di voi mi convinca del contrario

  12. #9
    Baby Droid


    Registrato dal
    May 2011
    Messaggi
    25

    Ringraziamenti
    0
    Ringraziato 7 volte in 7 Posts
    Predefinito

    Quote Originariamente inviato da mikelmanto Visualizza il messaggio
    Salve, grazie dell'aiuto.... funziona ma vorrei che al fine
    del lavoro si possa anche togliere la ProgressDialog.

    Mi sapreste dire come fare modificando questo codice precedente?

    Mi lancia una nullPointerException.

    Questo lo faccio nella classe che richiama la innerclass per visualizzare
    la finestra di attesa



    e questo codice come consigliato precedentemente



    Grazie per ogni aiuto anche perché ho provato 1000 modi per usare
    una ProgressDialog ma non ho mai avuto successo....

    inizio a pensare che non ci riuscirò.... spero qualcuno di voi mi convinca del contrario
    Passa i LOG di LogCat dove avviene il NullPointerException.

  13. #10
    Baby Droid


    Registrato dal
    Jun 2010
    Messaggi
    22

    Ringraziamenti
    2
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Nel frattempo ho fatto qualche prova
    e ora non mi esce più il NullPointerException
    ma non mi visualizza neanche il ProgressDialog.

    posto il codice



    In ogni caso volevo chiedere se Lei mi può modificare il codice in modo che appaia la ProgressDialog e scompaia dopo il while.

    La ringrazio anticipatamente

    Per il logcat... ho scaricato l'applicazione ma non avendola mai usata
    non so come si copia ed incolla il testo.

Pagina 1 di 2 12 ultimoultimo
Ultima pagina

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy