CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: megthebest con ben 1 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: carotix con ben 4 Thanks ricevuti negli ultimi sette giorni
Utente del mese: megthebest con ben 21 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 14: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

     
    1
    2
    3
        //handler finestraAttesa
    4
        private Handler handlerFinestraAttesa = new Handler(){
    5
            public void handleMessage(Message msg){
    6
                finestraAttesa.dismiss();
    7
                if(msg.what == 1){
    8
                    Toast toast = Toast.makeText(null, "CARICAMENTO EFFETTUATO CON SUCCESSO", Toast.LENGTH_LONG);
    9
                    toast.show();
    10
                }
    11
                else{
    12
                    Toast toast = Toast.makeText(null, "PROBLEMA NEL CARICAMENTO", Toast.LENGTH_LONG);
    13
                    toast.show();
    14
                }
    15
            }
    16
        };
    17
    18


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

    49
     
    1
    2
    3
        public void aggiornaDatabaseTesi(){
    4
            //TODO DA IMPLEMENTARE
    5
           try{
    6
                finestraAttesa = new ProgressDialog(this);
    7
                finestraAttesa.setIndeterminate(true);
    8
                finestraAttesa.setTitle("Attendere prego....");
    9
                //finestraAttesa.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    10
                //finestraAttesa.setMax(11);
    11
                finestraAttesa.show();
    12
                
    13
                new Thread(new Runnable() {
    14
    15
                    public void run() {
    16
                        // TODO Auto-generated method stub
    17
                        
    18
                        try{
    19
                            
    20
                            scaricaCodTesi();
    21
                            
    22
                            handlerFinestraAttesa.sendEmptyMessage(1);
    23
                            
    24
                        }catch(Exception e){
    25
                            handlerFinestraAttesa.sendEmptyMessage(0);
    26
                        }
    27
                        
    28
                    }
    29
                    
    30
                });
    31
                
    32
                //setProgress(11);
    33
                //FIXME: DEBUG
    34
                if(listaTesi == null)
    35
                    listaTesi = new LinkedList<String>();
    36
                listaTesi.add(testoHtmlTesi);
    37
                onStart();
    38
                
    39
                //FIXME----> usare Handler per gestire la ProgressDialog
    40
                
    41
           }catch(Exception e){
    42
               TextView testoErrore = new TextView(this);
    43
               testoErrore.setText(e.toString());
    44
               layoutContenutoTesi.addView(testoErrore);
    45
           }
    46
            
    47
        }
    48
    49


    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:

    18
     
    1
    private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
    2
            private ProgressDialog myPd;
    3
    4
            @Override
    5
            protected void onPreExecute() {
    6
                myPd = ProgressDialog.show((Context)this, "Login" , "Login in corso!",true);
    7
            }
    8
    9
            @Override
    10
            protected Void doInBackground(Void... params) {
    11
            // robe in background
    12
            }
    13
    14
            @Override
    15
            protected void onPostExecute(Void result) {
    16
                myPd.dismiss();
    17
            }
    18
        }


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

    3
     
    1
     [...]
    2
     new MyAsyncTask().execute();
    3
    Ultima modifica di androidlab; 01-06-11 alle 09: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:

    18
     
    1
    private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
    2
            private ProgressDialog myPd;
    3
    4
            @Override
    5
            protected void onPreExecute() {
    6
                myPd = ProgressDialog.show((Context)this, "Login" , "Login in corso!",true);
    7
            }
    8
    9
            @Override
    10
            protected Void doInBackground(Void... params) {
    11
            // robe in background
    12
            }
    13
    14
            @Override
    15
            protected void onPostExecute(Void result) {
    16
                myPd.dismiss();
    17
            }
    18
        }


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

    3
     
    1
     [...]
    2
     new MyAsyncTask().execute();
    3
    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

    18
     
    1
    2
    3
             if(firstRun){
    4
                 
    5
                 new MyAsyncTask(this).execute();        
    6
                 
    7
                 int i = 0;
    8
                 while(i < 1000000){
    9
                     i++;
    10
                 }
    11
                 
    12
                 firstRun = false;
    13
                 
    14
                 onStart();
    15
             
    16
             }
    17
    18


    e questo codice come consigliato precedentemente

    32
     
    1
    2
    3
        private class MyAsyncTask extends AsyncTask<Void, Void, Void>{
    4
    5
            private ProgressDialog finestraDialogo;
    6
            private Context contesto;
    7
            
    8
            public MyAsyncTask(Context contesto){
    9
                this.contesto = contesto;
    10
            }
    11
            
    12
            @Override
    13
            protected void onPostExecute(Void result) {
    14
                // TODO Auto-generated method stub
    15
                finestraDialogo.dismiss();
    16
            }
    17
    18
            @Override
    19
            protected void onPreExecute() {
    20
                // TODO Auto-generated method stub
    21
                finestraDialogo = ProgressDialog.show(contesto, "CARICAMENTO", "Attendere prego", true);
    22
            }
    23
    24
            @Override
    25
            protected Void doInBackground(Void... arg0) {
    26
                // TODO Auto-generated method stub
    27
                return null;
    28
            }
    29
            
    30
        }
    31
    32


    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

    18
     
    1
    2
    3
             if(firstRun){
    4
                 
    5
                 new MyAsyncTask(this).execute();        
    6
                 
    7
                 int i = 0;
    8
                 while(i < 1000000){
    9
                     i++;
    10
                 }
    11
                 
    12
                 firstRun = false;
    13
                 
    14
                 onStart();
    15
             
    16
             }
    17
    18


    e questo codice come consigliato precedentemente

    32
     
    1
    2
    3
        private class MyAsyncTask extends AsyncTask<Void, Void, Void>{
    4
    5
            private ProgressDialog finestraDialogo;
    6
            private Context contesto;
    7
            
    8
            public MyAsyncTask(Context contesto){
    9
                this.contesto = contesto;
    10
            }
    11
            
    12
            @Override
    13
            protected void onPostExecute(Void result) {
    14
                // TODO Auto-generated method stub
    15
                finestraDialogo.dismiss();
    16
            }
    17
    18
            @Override
    19
            protected void onPreExecute() {
    20
                // TODO Auto-generated method stub
    21
                finestraDialogo = ProgressDialog.show(contesto, "CARICAMENTO", "Attendere prego", true);
    22
            }
    23
    24
            @Override
    25
            protected Void doInBackground(Void... arg0) {
    26
                // TODO Auto-generated method stub
    27
                return null;
    28
            }
    29
            
    30
        }
    31
    32


    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

    42
     
    1
    2
    3
        try{
    4
             LinearLayout layout = new LinearLayout(this);
    5
             layout.setOrientation(1);
    6
             
    7
             TextView titolo = new TextView(this);
    8
             titolo.setText("PROVA DIALOG");
    9
             layout.addView(titolo);
    10
            
    11
             if(firstRun){
    12
                 
    13
                 //attesa = 
    14
                new MyAsyncTask(this).execute();    
    15
                 //attesa.execute();
    16
                 
    17
                 int i = 0;
    18
                 while(i < 1000000){
    19
                     i++;
    20
                 }
    21
                 
    22
                 firstRun = false;
    23
                 
    24
                 onStart();
    25
             
    26
             }
    27
             if(!firstRun){
    28
                 
    29
                 //if(attesa != null)
    30
                //   attesa.cancel(true);
    31
                 
    32
                 titolo.setText("TOLTA LA DIALOG...SPERIAMO");
    33
                 //onCreateDialog(2);
    34
             }
    35
             
    36
             setContentView(layout);
    37
        }catch(Exception e){
    38
            Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
    39
        }
    40
         
    41
    42


    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