Autore Topic: Thread che rallenta l'app  (Letto 747 volte)

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Thread che rallenta l'app
« il: 10 Settembre 2015, 11:11:03 CEST »
0
Salve a tutti, ho un problema riguardante la gestione dei thread. Nella mia app al click di un pulsante devo collegarmi ad un database tramite pagina php per scaricare dei dati. Nel frattempo vorrei mostrare una progressDialog e successivamente plottare su di un grafico i dati che ho scaricato precedentemente.
Premetto che non ho esperienza nell'utilizzo di un database ma facendo un po' di prove ho notato che il thread del database faccia "bloccare" l'app fino a quando non ha quasi finito di scaricare i dati e infatti vedo a malapena 1 secondo la progressDialog che dovrebbe durare 7 secondi. Android Studio mi fa notare questo warning:
 
Codice: [Seleziona]
Skipped 363 frames!  The application may be doing too much work on its main thread.
In realtà dovrebbero essere in thread separati. Questo è il mio codice:

Codice (Java): [Seleziona]
if (id == R.id.refresh) {

            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {


                        select();


                    } catch (Exception e) {
                        e.printStackTrace();
                    }


                }
            });
            thread.start();

            final ProgressDialog ringProgressDialog = ProgressDialog.show(MainActivity.this, "Please wait ...", "Downloading Image ...", true);

            ringProgressDialog.setCancelable(true);

            new Thread(new Runnable() {

                @Override

                public void run() {
                    try {

                        // Here you should write your time consuming task...

                        // Let the progress ring for 10 seconds...

                        Thread.sleep(7000);

                    } catch (Exception e) {



                    }

                    ringProgressDialog.dismiss();

                }

            }).start();




            while (thread.isAlive()) {
                //funzioneStampa();
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            funzioneStampa();
            try {
                Thread.sleep((500));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            return true;
        }

Come potrei risolvere questo problema? Il tutto è dovuto dalla connessione con il database?
Grazie! :)

Offline Nicolab1971

  • Utente junior
  • **
  • Post: 108
  • Respect: +2
    • Mostra profilo
Re:Thread che rallenta l'app
« Risposta #1 il: 10 Settembre 2015, 21:54:42 CEST »
0
Potresti provare a utilizzare un AsyncTask, semplificherebbe la logica del tuo codice.


Inviato dal mio iPhone utilizzando Tapatalk

Offline Nicolab1971

  • Utente junior
  • **
  • Post: 108
  • Respect: +2
    • Mostra profilo
Re:Thread che rallenta l'app
« Risposta #2 il: 10 Settembre 2015, 21:54:52 CEST »
0
http://developer.android.com/reference/android/os/AsyncTask.html


Inviato dal mio iPhone utilizzando Tapatalk

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Thread che rallenta l'app
« Risposta #3 il: 10 Settembre 2015, 22:06:38 CEST »
0
Grazie per la risposta. Tu mi consigli quindi di fare un solo thread di tipo AsyncTask? Invece che due thread come nel mio codice?

Inviato dal mio GT-I9505G utilizzando Tapatalk


Offline Nicolab1971

  • Utente junior
  • **
  • Post: 108
  • Respect: +2
    • Mostra profilo
Re:Thread che rallenta l'app
« Risposta #4 il: 11 Settembre 2015, 09:20:47 CEST »
0
Secondo me ti renderebbe la vita più facile, quando implementi l'AsyncTaks hai a disposizione tre metodi di cui fare l'override.

In onPreExecute ci metti la logica che ti serve a creare le condizioni di degault prima del download, tipo l'azzeramento della progressDialog, nel doInBackground ci metti la logica del download e la creazione se ne hai bisogni di una array di oggetti che cinterranno i tuoi dati e che serviranno successivamente al plot del grafico.
In onPostExecute recuperi la lista degli oggetti e popoli il tuo grafico. Nell'ultimo metodo onProgressUpdate metti il codice per l'avanzamento della progress dialog.

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Thread che rallenta l'app
« Risposta #5 il: 11 Settembre 2015, 10:09:30 CEST »
0
Concordo con Nicolab1971
ti posto un esempio di asyntask già postato in precedenza
Codice (Java): [Seleziona]
private class TaskEsempio extends AsyncTask<String, Void, String> {

@Override
        protected void onPreExecute() {
        super.onPreExecute();
//prima del doinbackground si passa per di qui , qui puoi inizializzare le variabili o un eventuale dialog che mostri il caricamento , gui puoi eseguire comandi che interagiscono con l'interfaccia " ricorda che avviene prima che la task si esegue
}
        @Override
        protected String doInBackground(String... params) {
                              // Esegue le operazione in background , qui non puoi eseguire istruzioni che interagiscono con l'interfaccia
                        return "fine";

        }

        @Override
        protected void onPostExecute(String result) {
        super.onPostExecute(result);
                            //quando finisce il  doinbackground si passa per di qui , mostri quindi il risultato ottenuto dal doinbackground , ovviamentew qui puoi inserire istruzioni che interagiscono con l'interfaccia
                   
        }

       

        @Override
        protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
// qui puoi mostrare eventuali risultati nel mentre che il doinbackground è in esecuzione " puoi interagire con l'interfaccia "
}
    }

per eseguirla
Codice (Java): [Seleziona]
new TaskEsempio().execute();
saluti

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Thread che rallenta l'app
« Risposta #6 il: 11 Settembre 2015, 19:06:49 CEST »
0
Grazie mille ad entrambi! Ora funziona correttamente! :)

Inviato dal mio SM-T320 utilizzando Tapatalk