Autore Topic: Gestione thread  (Letto 618 volte)

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Gestione thread
« il: 04 Settembre 2014, 11:14:49 CEST »
0
Salve a tutti...
Vorrei chiedervi, se dal thread principale(della UI) creao e avvio un thread secondario, come faccio da quest'ultimo a incaricare totalmente il thread principale a eseguire qualche lavoro?
Mi spiego meglio...
ad esempio se dal thread secondario voglio stampare qualcosa su una TextView, ho visto che posso utilizzare il seguente codice:
Codice (Java): [Seleziona]
NomeActivity.this.runOnUiThread(new Runnable() {

                                                                        @Override
                                                                        public void run() {
                                                                                //operazione da effettuare
                                                                               nomeTextView.setText("testo....");
                                                                        }
                                                                });

Però a quanto pare questa operazione viene effettuata dal thread secondario(e non da quello principale), in quanto ho fatto la seguente prova:
Codice (Java): [Seleziona]
private class ThreadSecondario extends Thread{
public void run(){
MainActivity.this.runOnUiThread(new Runnable() {

                                                                        @Override
                                                                        public void run() {
                                                                                Thread.sleep(10000);  //questo dovrebbe stoppare per 10secondi
                                                                                textView.setText("primo");
                                                                        }
                                                                });


MainActivity.this.runOnUiThread(new Runnable() {

                                                                        @Override
                                                                        public void run() {
                                                                                textView.setText("secondo");
                                                                        }
                                                                });
}
}


Eseguendo il thread per 10 secondi non succede nulla, passati i 10 secondi viene stamato "primo" e subito dopo "secondo". Quindi viene stoppato il thread secondario....

CONCLUSIONE:
A me servirebbe un meccanismo in modo che il thread secondario incarica totalmente il thread principale a effettuare l'operazione. Così il thread secondario appena notifica ciò al thread principale, torna immediatamente a fare il proprio lavoro...

Sapete aiutarmi?


Vi ringrazio molto....

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:Gestione thread
« Risposta #1 il: 04 Settembre 2014, 11:30:53 CEST »
0
Partiamo da un punto fermo: mai usare Thread.sleep(10000); nel thread di UI... non qualche volta o raramente... MAI (se fosse possibile, dovrebbe dare errore il compilatore).

Se vuoi avere dei ritardi, non usare Thread.sleep(), usa ciò che viene messo a disposizione dai linguaggi e dai framework moderni: puoi impostare un AlarmManager, oppure puoi inviare un MessageDelayed. Se proprio vuoi usarlo, mettilo nel thread secondario e allo scadere, fai eseguire una runOnUiThread.

Un'ultima nota:
Citazione
Così il thread secondario appena notifica ciò al thread principale, torna immediatamente a fare il proprio lavoro...

Questo concetto è l'opposto di quello che si deve fare: l'importante è che il thread principale sia il più possibile scarico, e che venga disturbato solo al momento esatto in cui c'è bisogno di fare qualcosa e nel più breve tempo possibile. Il thread principale è quello nobile, perchè è di UI.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Gestione thread
« Risposta #2 il: 04 Settembre 2014, 11:36:23 CEST »
0
Perfetto, ti ringrazio infinitamente.

L'applicazione che sto progettando ha un thread secondario che fa altre cose(non la semplice stampa di qualcosa), mi servirebbe assolutamente un meccanismo in modo che lo stesso thread secondario possa "incaricare" il thread principale di fare qualcosa (passandogli dati ricevuti) così che il thread secondario possa tornare immediatamente a fare il suo lavoro.. "quindi non lo fa il thread secondario..."

Che meccanismo può essere utilizzato?

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:Gestione thread
« Risposta #3 il: 04 Settembre 2014, 13:49:40 CEST »
0
Perfetto, ti ringrazio infinitamente.

L'applicazione che sto progettando ha un thread secondario che fa altre cose(non la semplice stampa di qualcosa), mi servirebbe assolutamente un meccanismo in modo che lo stesso thread secondario possa "incaricare" il thread principale di fare qualcosa (passandogli dati ricevuti) così che il thread secondario possa tornare immediatamente a fare il suo lavoro.. "quindi non lo fa il thread secondario..."

Che meccanismo può essere utilizzato?

Implementa un Handler nel thread di UI, passa il riferimento all'Handler al thread secondario in fase di creazione, a questo punto il thread secondario manderà un messaggio a quello primario (di UI), che lo riceverà nell'handler ed eseguirà quello che deve.

C'è un esempio di questo meccanismo nel tutorial di introduzione ai Thread, in questo stesso forum.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Re:Gestione thread
« Risposta #4 il: 16 Ottobre 2014, 15:18:11 CEST »
0
Perfetto, ti ringrazio infinitamente.

L'applicazione che sto progettando ha un thread secondario che fa altre cose(non la semplice stampa di qualcosa), mi servirebbe assolutamente un meccanismo in modo che lo stesso thread secondario possa "incaricare" il thread principale di fare qualcosa (passandogli dati ricevuti) così che il thread secondario possa tornare immediatamente a fare il suo lavoro.. "quindi non lo fa il thread secondario..."

Che meccanismo può essere utilizzato?

Se vuoi uno pseudo codice:

Codice: [Seleziona]


      class ControlThread extends Thread {
         // Dichiaro l'handler per la risposta
         private Handler handler;

         public ControlThread(Handler handler) {
            this.handler = handler;
         }

         public void run() {
           /*fai qualcosa*/
            if(/*succede quello che vuoi*/)
               notifyMessage("Evento");
         }

         /***
          * Notifica messaggio da WorkingThread a main
          *
          * @param str
          *           stringa messaggio.
          */
         private void notifyMessage(String str) {
            // ottengo messaggio.
            Message msg = handler.obtainMessage();
            // preparo il bundle.
            Bundle b = new Bundle();
            // inserisco stringa.
            b.putString("EventoAccaduto", "" + str);
            // incapsulo bundle in messaggio.
            msg.setData(b);
            // invio
            handler.sendMessage(msg);
         }
      }


Handler:

Codice: [Seleziona]
   private class ControlThreadHandler extends Handler {

      @Override
      public void handleMessage(Message msg) {
         // ricavo nuovamente il bundle.
         Bundle bundle = msg.getData();
         // dato che il bundle ha struttura key-->value
         if (bundle.containsKey("EventoAccaduto")) {
           /*Fai quello che devi fare*/

         }
      }
   }


Chiamate..

Codice: [Seleziona]
/*** Start Thread **/
      Handler handler = new ControlThreadHandler();
      ControlThread thr = new ControlThread(handler);
      thr.start();



Spero di esserti stato d'aiuto!

Ciaooooo

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Gestione thread
« Risposta #5 il: 16 Ottobre 2014, 16:05:03 CEST »
0
Ti ringrazio molto,
Comunque si l ho implementato tale e quale...

 :-)