Autore Topic: ProgressBar che attende  (Letto 423 volte)

Offline andre_sghedo

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows 7
ProgressBar che attende
« il: 26 Marzo 2014, 10:07:32 CET »
0
Salve a tutti,
ho un piccolo ma fastidioso problema per completare l'app che dovrò presentare in sede di laurea, il mio problema è quando schiaccio un bottone e l'ascoltatore dietro ha del lavoro da fare(aspettare alcuni thread per il login) e io vorrei che una progress bar circolare parta subito e non aspetti tutto il lavoro dei thread per poi partire dopo e andare in esecuzione per un brevissimo istante prima di passare all'activity sucessiva.
Non so se mi sono spiegato.
Ora posto il codice:
Codice (Java): [Seleziona]
connectButton.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                                                       
                                ip=ipEditText.getText().toString();
                                user=userEditText.getText().toString();
                                password=passwordEditText.getText().toString();
                                pbLogin.getHandler().post(new Runnable() {
                                    public void run() {
                                        pbLogin.setVisibility(View.VISIBLE);
                                    }
                                });
                                /////////////////////////////////////////////////
                                Runnable runLogin = new Runnable() {                    //
                                        public void run() {                                                     //
                                                try {                                                                   //
                                                        Thread.sleep(5000);                                     //
                                                }                                                                               //
                                                catch (Exception e){}                                   //
                                        }                                                                                       //TIMER 5 sec.
                                };                                                                                              //
                                                                                                                                //
                                Thread threadLog = new Thread(runLogin);                //
                                threadLog.start();                                                              //
                                try {                                                                                   //
                                        threadLog.join();                                                       //
                                } catch (InterruptedException e) {                              //
                                                                                                                                //
                                }///////////////////////////////////////////////

Come si vede la variabile ProgressBar pbLogin non va in esecuzione subito ma ad esempio aspetta il time di  5 secondi(che ho messo come prova).
Grazie a chiunque mi possa dare una mano, non so perche non funziona con questa soluzione!!!!

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:ProgressBar che attende
« Risposta #1 il: 26 Marzo 2014, 10:32:15 CET »
0
Non ho capito perchè il pbLogin.setVisibility(View.VISIBLE); lo metti dentro un runnable. Lancialo direttamente dall'onclicklistener, poi avvierai il thread e al termine del thread nasconderai nuovamente pbLogin.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline andre_sghedo

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows 7
Re:ProgressBar che attende
« Risposta #2 il: 26 Marzo 2014, 10:36:11 CET »
0
Intanto grazie dell'aiuto ma se io faccio:
Codice (Java): [Seleziona]
/** evento al click del connectButton */
                connectButton.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                                                       
                                ip=ipEditText.getText().toString();
                                user=userEditText.getText().toString();
                                password=passwordEditText.getText().toString();
                                 pbLogin.setVisibility(View.VISIBLE);
                                /////////////////////////////////////////////////
                                Runnable runLogin = new Runnable() {                    //
                                        public void run() {                                                     //
                                                try {                                                                   //
                                                        Thread.sleep(5000);                                     //
                                                }                                                                               //
                                                catch (Exception e){}                                   //
                                        }                                                                                       //TIMER 5 sec.
                                };                                                                                              //
                                                                                                                                //
                                Thread threadLog = new Thread(runLogin);                //
                                threadLog.start();                                                              //
                                try {                                                                                   //
                                        threadLog.join();                                                       //
                                } catch (InterruptedException e) {                              //
                                                                                                                                //
                                }///////////////////////////////////////////////

Si verifica sempre il medesimo problema...avevo provato a settare la visibilità in un runnable, forse non ha tanto senso ad ogni modo anche così non funziona purtroppo!! aspetta prima i 5 secondi del time e poi va in esecuzione un brevissimo istante e dopo passa all'activity successiva...non so perche non la mette visibile subito..

Offline arlabs

  • Utente normale
  • ***
  • Post: 433
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:ProgressBar che attende
« Risposta #3 il: 26 Marzo 2014, 11:14:37 CET »
0
Perdona, ma che senso ha lanciare un elaborazione in un thread parallelo se poi il tread principale fa join su tale tread?
Il tread principale rimane comunque bloccato così.

E' per quello che la grafica non viene aggiornata.

Togli il join e dovrebbe visualizzarsi.

Ciao.

Offline andre_sghedo

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows 7
Re:ProgressBar che attende
« Risposta #4 il: 26 Marzo 2014, 11:22:07 CET »
0
lo sleep l'ho messo solo per prova ma lo so che non ha senso..anche togliendo il timer che ho messo come prova la progress non parte subito..
Dopo il pbLogin.setVisibility(View.VISIBLE);  ho un thread che mi cerca di connettersi ad un server e la pbLogin prima di essere visibile aspetta quei thread..non so perche..comunque non è il join del thread di sleep il problema..

Offline arlabs

  • Utente normale
  • ***
  • Post: 433
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:ProgressBar che attende
« Risposta #5 il: 26 Marzo 2014, 11:29:07 CET »
0
Posta il codice anche con l'altro thread.

Offline andre_sghedo

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows 7
Re:ProgressBar che attende
« Risposta #6 il: 26 Marzo 2014, 11:37:24 CET »
0
Codice (Java): [Seleziona]
/** evento al click del connectButton */
                connectButton.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View view) {
                                                       
                                ip=ipEditText.getText().toString();
                                user=userEditText.getText().toString();
                                password=passwordEditText.getText().toString();
                                //pbLogin.setVisibility(View.VISIBLE);
                                parti();
                        /*      /////////////////////////////////////////////////
                                Runnable runLogin = new Runnable() {                    //
                                        public void run() {                                                     //
                                                try {                                                                   //
                                                        Thread.sleep(5000);                                     //
                                                }                                                                               //
                                                catch (Exception e){}                                   //
                                        }                                                                                       //TIMER 5 sec.
                                };                                                                                              //
                                                                                                                                //
                                Thread threadLog = new Thread(runLogin);                //
                                threadLog.start();                                                              //
                                try {                                                                                   //
                                        threadLog.join();                                                       //
                                } catch (InterruptedException e) {                              //
                                                                                                                                //
                                }///////////////////////////////////////////////
                        */

                                if(checkValue(user,password)){
                               
                                        serverComunication=new Comunication();                         
                                        statusComunication=serverComunication.openSockets(ip);
                               
                                        if(statusComunication.equals("connected")){
                               
                                                login=serverComunication.logIn(user, password);
                                                       
                                                if(login==null){
                               
                                                        login="invariated";                            
                                                }
                       
                                //se l'utente non ha immesso un giusto user...
                                if (login.equals("unlog")){
                                                                       
                                        Toast.makeText(getApplicationContext(), "Utente o password errati", Toast.LENGTH_LONG).show();         
                                }
                                if (login.equals("invariated")){
                                       
                                        Toast.makeText(getApplicationContext(), "Connection problem", Toast.LENGTH_LONG).show();       
                                }
                                //se l'utente è loggato...                            
                                if(login.equals("log")){
                                                                               
                                        arraySong=serverComunication.getTitle();                                                 
                                        intent=new Intent(getApplicationContext(), StreamingActivity.class);                                             
                                        intent.putExtra("user", user);                                                           
                                        intent.putStringArrayListExtra("arraySong", (ArrayList<String>) arraySong);                                              
                                        finish();      
                                        startActivity(intent);
                                 
                                }                                              
                                        }                              
                                        else                                   
                                                Toast.makeText(getApplicationContext(), "Connessione al server fallita", Toast.LENGTH_LONG).show();                    
                                }                              
                                else
                                        Toast.makeText(getApplicationContext(), "Controllare user e password immessi", Toast.LENGTH_LONG).show();
                        }
                }              
                                );//fine evento del connectButton      

I metodi openSockets e getTitle mandano 2 thread e ognuno di questi sono aspettati tramite il metodo join...è necessario per me che questi due thread siano aspettati e in questa sequenza...il problema sta nel fatto di utilizzare la chiamata join che blocca la grafica ma io ho bisogno che la progress bar almeno vada in funzione,..

Post unito: 26 Marzo 2014, 11:38:30 CET
scusa nel codice sopra fai conto che sia cosi:
Codice (Java): [Seleziona]
pbLogin.setVisibility(View.VISIBLE);
                                //parti();

Offline arlabs

  • Utente normale
  • ***
  • Post: 433
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:ProgressBar che attende
« Risposta #7 il: 26 Marzo 2014, 11:46:40 CET »
0
Come vedi il motivo è quello di prima, tieni occupato il thread principale nella onClick.

Ogni operazione di rete (lenta) deve essere fatta in modo asicrono (lanciare un secondo thread e poi fare join su di esso non è asincrono).

Ti consiglio di usare l'AsyncTask

AsyncTask | Android Developers

Ciao.