Autore Topic: Problema con thread.  (Letto 606 volte)

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Problema con thread.
« il: 30 Giugno 2014, 12:26:04 CEST »
0
Ciao a tutti ragazzi,
mi trovo di fronte a un problema... vi spiego cosa dovrei fare:

Devo controllare una variabile nel mio progetto che quando raggiunge un certo valore il mio Working thread  deve comunicarlo al mainActivity thread.

Il mio problema dopo aver letto numerose guide è il seguente:

la variabile che viene passata al thread è dinamica, ovvero, viene continuamente modificata nel mainActivity thread e, come ho gia provato una volta che passo la variabile al working thread le modifiche fatte nel mainActivity non vengono viste dal working thread.

Come posso fare a risolvere il mio problema?

La classe ho provato implementarla nel seguente modo:

Codice: [Seleziona]
class MyThread extends Thread {
          private Handler handler;
          private int num;
          private int i = 0;
          public MyThread(Handler handler,int num) {
                  this.num = num;
            this.handler = handler;
          }
          public void run() {
            try {
              while(num!=1) {
                notifyMessage("Secondi "+i);
                Thread.sleep(1000);
                i++;
              }
              notifyMessage("okkkkkk va bene");
            }catch(InterruptedException ex) {}
          }

          private void notifyMessage(String str) {
            Message msg = handler.obtainMessage();
            Bundle b = new Bundle();
            b.putString("refresh", ""+str);
            msg.setData(b);
            handler.sendMessage(msg);
          }
        }


e nel mainActivity :


Codice: [Seleziona]
Handler handler = new MyHandler();
                        MyThread  thr = new MyThread(handler,a);
                    thr.start();

                }
               
                 private class MyHandler extends Handler {
                         
                    @Override
                    public void handleMessage(Message msg) {
                      Bundle bundle = msg.getData();
                      if(bundle.containsKey("refresh")) {
                        String value = bundle.getString("refresh");
                        Toast.makeText(getApplicationContext(), value, Toast.LENGTH_SHORT).show();
                       
                      }
                    }
                  }


dove la variabile a è quella da monitorare.

Grazie in anticipo ragazzi!

Offline eagledeveloper

  • Translate Team
  • Utente senior
  • ****
  • Post: 516
  • Respect: +37
    • Google+
    • 347516210
    • dark_pinz
    • @WandDStudios
    • Mostra profilo
    • W&D Studios
  • Dispositivo Android:
    HTC One X e HTC One
  • Play Store ID:
    W%26D+Studios
  • Sistema operativo:
    Ubuntu / Windows 7
Re:Problema con thread.
« Risposta #1 il: 30 Giugno 2014, 13:01:04 CEST »
0
Ma dov'e' che modifichi la variabile a?
I numeri contano molto di più del seme.

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Re:Problema con thread.
« Risposta #2 il: 30 Giugno 2014, 13:09:11 CEST »
0
Ma dov'e' che modifichi la variabile a?

Ciao , grazie per la risposta, la variabile  a la devo modificare  dalla activitymain !

Offline eagledeveloper

  • Translate Team
  • Utente senior
  • ****
  • Post: 516
  • Respect: +37
    • Google+
    • 347516210
    • dark_pinz
    • @WandDStudios
    • Mostra profilo
    • W&D Studios
  • Dispositivo Android:
    HTC One X e HTC One
  • Play Store ID:
    W%26D+Studios
  • Sistema operativo:
    Ubuntu / Windows 7
Re:Problema con thread.
« Risposta #3 il: 30 Giugno 2014, 13:36:13 CEST »
0
Beh ma allora devi fare una classe interna per il tuo thread e le variabile a la metti come globale, così sia il thread che l'activity la vedono.
I numeri contano molto di più del seme.

iClaude

  • Visitatore
Re:Problema con thread.
« Risposta #4 il: 30 Giugno 2014, 14:15:29 CEST »
0
Prova a definire la variabile come "volatile" (private volatile int...).
Non so esattamente come funziona la Dalvick VM, ma ad esempio la JVM fa delle copie provvisorie delle variabili utilizzate da più thread, sincronizzando il valore quando lo ritiene opportuno. Con volatile invece le sincronizza ad ogni cambiamento.
Dovrebbe essere così anche x Android: prova...

Ah, nel tuo codice num viene cmq passato per valore, per cui avrà sempre lo stesso valore in ogni caso. Quindi devi anche creare una classe interna come suggerito da eagledeveloper..
« Ultima modifica: 30 Giugno 2014, 14:19:54 CEST da iClaude »

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Re:Problema con thread.
« Risposta #5 il: 30 Giugno 2014, 14:20:22 CEST »
0
Beh ma allora devi fare una classe interna per il tuo thread e le variabile a la metti come globale, così sia il thread che l'activity la vedono.

Avresti mica un esempio?
Perchè non mi è molto chiaro..

Offline eagledeveloper

  • Translate Team
  • Utente senior
  • ****
  • Post: 516
  • Respect: +37
    • Google+
    • 347516210
    • dark_pinz
    • @WandDStudios
    • Mostra profilo
    • W&D Studios
  • Dispositivo Android:
    HTC One X e HTC One
  • Play Store ID:
    W%26D+Studios
  • Sistema operativo:
    Ubuntu / Windows 7
Re:Problema con thread.
« Risposta #6 il: 30 Giugno 2014, 14:22:41 CEST »
0
Quando diciamo di creare una classe interna capisci cosa si intende?
I numeri contano molto di più del seme.

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Re:Problema con thread.
« Risposta #7 il: 30 Giugno 2014, 14:27:35 CEST »
0
Prova a definire la variabile come "volatile" (private volatile int...).
Non so esattamente come funziona la Dalvick VM, ma ad esempio la JVM fa delle copie provvisorie delle variabili utilizzate da più thread, sincronizzando il valore quando lo ritiene opportuno. Con volatile invece le sincronizza ad ogni cambiamento.
Dovrebbe essere così anche x Android: prova...

Ah, nel tuo codice num viene cmq passato per valore, per cui avrà sempre lo stesso valore in ogni caso. Quindi devi anche creare una classe interna come suggerito da eagledeveloper..

ciao grazie per la risposta,
ma non ho capito bene il fatto della classe interna, se avete un esempio sarebbe molto gradito  :-P

Post unito: 30 Giugno 2014, 14:30:55 CEST
Quando diciamo di creare una classe interna capisci cosa si intende?

Non saprei come implementarla dato che la mia variabile è un semplice int.
« Ultima modifica: 30 Giugno 2014, 14:30:55 CEST da Fullydroid, Reason: Merged DoublePost »

iClaude

  • Visitatore
Re:Problema con thread.
« Risposta #8 il: 30 Giugno 2014, 14:45:19 CEST »
0
Inserisci la classe che gestisce il thread all'interno della Activity dove il thread è utilizzato. Togli la variabile num interna al thread e dichiari una variabile di istanza num di tipo volatile.
A questo punto il thread dovrebbe accedere direttamente a questa variabile.

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Re:Problema con thread.
« Risposta #9 il: 30 Giugno 2014, 15:02:22 CEST »
+1
Inserisci la classe che gestisce il thread all'interno della Activity dove il thread è utilizzato. Togli la variabile num interna al thread e dichiari una variabile di istanza num di tipo volatile.
A questo punto il thread dovrebbe accedere direttamente a questa variabile.

Ok, ho provato e ora funziona!

Se in futuro a qualcun altro dovesse servire posto un po di pezzi di codice:

Dichiarare la variabile come volatile
esempio:
Codice: [Seleziona]

private volatile int a = 45;


dentro l'activity creare la classe thread:

Codice: [Seleziona]
class MyThread extends Thread {
                                  private Handler handler;
                                  private int i = 0;
                                  public MyThread(Handler handler,int num) {
                                    this.handler = handler;
                                  }
                                  public void run() {
                                    try {
                                      while(a!=1) {
                                        notifyMessage("Secondi "+i);
                                        Thread.sleep(1000);
                                        i++;
                                      }
                                      notifyMessage("okkkkkk va bene");
                                    }catch(InterruptedException ex) {}
                                  }

                                  private void notifyMessage(String str) {
                                    Message msg = handler.obtainMessage();
                                    Bundle b = new Bundle();
                                    b.putString("refresh", ""+str);
                                    msg.setData(b);
                                    handler.sendMessage(msg);
                                  }
                                }

Ricordarsi di creare il gestore dei messaggi ricevuti dall'activity padre..

Codice: [Seleziona]
private class MyHandler extends Handler {
                         
                    @Override
                    public void handleMessage(Message msg) {
                      Bundle bundle = msg.getData();
                      if(bundle.containsKey("refresh")) {
                        String value = bundle.getString("refresh");
                        Toast.makeText(getApplicationContext(), value, Toast.LENGTH_SHORT).show();
                       
                      }
                    }
                  }

per concludere per attivare il thread nell'activity..

Codice: [Seleziona]
                        /***prova thread**/
                        Handler handler = new MyHandler();
                        MyThread  thr = new MyThread(handler,a);
                        thr.start();


grazie mille ragazzi ;)