CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: megthebest con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: carotix con ben 6 Thanks ricevuti negli ultimi sette giorni
Utente del mese: megthebest con ben 28 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 10 su 10
Discussione:

Gestione thread

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
    Androidiano


    Registrato dal
    Jul 2014
    Messaggi
    59

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Gestione thread

    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:

    x
     
    1
    NomeActivity.this.runOnUiThread(new Runnable() {
    2
    3
                                                                            @Override
    4
                                                                            public void run() {
    5
                                                                                    //operazione da effettuare
    6
                                                                                   nomeTextView.setText("testo....");
    7
                                                                            }
    8
                                                                    });


    Però a quanto pare questa operazione viene effettuata dal thread secondario(e non da quello principale), in quanto ho fatto la seguente prova:

    21
     
    1
    private class ThreadSecondario extends Thread{
    2
    public void run(){
    3
    MainActivity.this.runOnUiThread(new Runnable() {
    4
    5
                                                                            @Override
    6
                                                                            public void run() {
    7
                                                                                    Thread.sleep(10000);  //questo dovrebbe stoppare per 10secondi
    8
                                                                                    textView.setText("primo");
    9
                                                                            }
    10
                                                                    });
    11
    12
    13
    MainActivity.this.runOnUiThread(new Runnable() {
    14
    15
                                                                            @Override
    16
                                                                            public void run() {
    17
                                                                                    textView.setText("secondo");
    18
                                                                            }
    19
                                                                    });
    20
    }
    21
    }


    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....

  2.  
  3. #2
    Androidiano


    Registrato dal
    Apr 2011
    Località
    Lodi
    Messaggi
    256
    Smartphone
    Samsung S2, Nexus 5

    Ringraziamenti
    5
    Ringraziato 32 volte in 31 Posts
    Predefinito

    ma fai il contrario no?
    Vedo tutto attraverso sabbia rossa e deserto...


  4. #3
    Androidiano


    Registrato dal
    Jul 2014
    Messaggi
    59

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    ehm no....
    mi serve proprio che il thread secondario delega il lavoro al thread principale così che il thread secondario torni immediatamente a fare il suo lavoro...

    Qualcuno conosce un meccanismo?

  5. #4
    Androidiano L'avatar di iClaude76


    Registrato dal
    Oct 2012
    Località
    Trento
    Messaggi
    207
    Smartphone
    Galaxy S3, Nexus 7, G. Tab 2 7

    Ringraziamenti
    1
    Ringraziato 27 volte in 25 Posts
    Predefinito

    Quote Originariamente inviato da chri13 Visualizza il messaggio
    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:

    8
     
    1
    NomeActivity.this.runOnUiThread(new Runnable() {
    2
    3
                                                                            @Override
    4
                                                                            public void run() {
    5
                                                                                    //operazione da effettuare
    6
                                                                                   nomeTextView.setText("testo....");
    7
                                                                            }
    8
                                                                    });


    Però a quanto pare questa operazione viene effettuata dal thread secondario(e non da quello principale), in quanto ho fatto la seguente prova:

    21
     
    1
    private class ThreadSecondario extends Thread{
    2
    public void run(){
    3
    MainActivity.this.runOnUiThread(new Runnable() {
    4
    5
                                                                            @Override
    6
                                                                            public void run() {
    7
                                                                                    Thread.sleep(10000);  //questo dovrebbe stoppare per 10secondi
    8
                                                                                    textView.setText("primo");
    9
                                                                            }
    10
                                                                    });
    11
    12
    13
    MainActivity.this.runOnUiThread(new Runnable() {
    14
    15
                                                                            @Override
    16
                                                                            public void run() {
    17
                                                                                    textView.setText("secondo");
    18
                                                                            }
    19
                                                                    });
    20
    }
    21
    }


    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....
    Beh, il comportamento è perfettamente normale: hai due metodi run che vengono entrambi eseguiti nel thread principale. Il primo ha un delay di tot secondi, quindi è normale che il secondo messaggio venga visualizzato dopo. Ma entrambi i metodi sono stati eseguiti nel thread principale.

  6. #5
    Androidiano


    Registrato dal
    Jul 2014
    Messaggi
    59

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Si confermo, hai pienamente ragione infatti.

    In ogni caso a me serve un meccanismo (simile a questo), nel quale il thread secondario resta in ascolto in una socket e ogni volta che riceve una stringa manda un messaggio al thread principale(con la stringa ricevuta) così che il thread secondario torna "immediatamente" in ascolto sulla socket e il thread principale appena riceve l'"avviso" processa la stringa....
    Cosa mi consigliate più appropriato, gli Handler?

  7. #6
    Androidiano L'avatar di iClaude76


    Registrato dal
    Oct 2012
    Località
    Trento
    Messaggi
    207
    Smartphone
    Galaxy S3, Nexus 7, G. Tab 2 7

    Ringraziamenti
    1
    Ringraziato 27 volte in 25 Posts
    Predefinito

    Quote Originariamente inviato da chri13 Visualizza il messaggio
    Si confermo, hai pienamente ragione infatti.

    In ogni caso a me serve un meccanismo (simile a questo), nel quale il thread secondario resta in ascolto in una socket e ogni volta che riceve una stringa manda un messaggio al thread principale(con la stringa ricevuta) così che il thread secondario torna "immediatamente" in ascolto sulla socket e il thread principale appena riceve l'"avviso" processa la stringa....
    Cosa mi consigliate più appropriato, gli Handler?
    In Android per gestire i thread di solito si usano gli AsyncTask o gli Handler, di solito collocati all'interno di un Service.
    Questa è la best practice, ma a seconda dalle esigenze puoi anche non usare i Service o usare il meccanismo di gestione dei thread di Java come nel tuo esempio. Tutto dipende dallo scopo e dalle tue esigenze.

  8. #7
    Androidiano


    Registrato dal
    Jul 2014
    Messaggi
    59

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Io semplicemente devo utilizzare un thread secondario che istanzia una socket e resta in attesa di ricevere stringhe sulla stessa socket. Ogni volta che riceve una stringa avvisa il thread principale(che ci farà delle operazioni) e torna immediatamente in ascolto sulla stessa socket.
    Che meccanismo mi consigli?

  9. #8
    Androidiano


    Registrato dal
    Apr 2011
    Località
    Lodi
    Messaggi
    256
    Smartphone
    Samsung S2, Nexus 5

    Ringraziamenti
    5
    Ringraziato 32 volte in 31 Posts
    Predefinito

    Usa due thread alla risposta della socket del primo lanci il secondo che fa le sue operazioni e poi termina mentre il primo continua a girare il Main lo usi solo per lanciare la prima volta il primo thread

    Inviato dal mio Nexus 5 usando Androidiani App
    Vedo tutto attraverso sabbia rossa e deserto...


  10. #9
    Androidiano


    Registrato dal
    Jul 2014
    Messaggi
    59

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Perfetto.
    Domanda:

    Nel seguente codice:
    16
     
    1
    2
    ***thread principale*****
    3
    new ThreadSecondario().start();
    4
    5
    **********************
    6
    7
    public class ThreadSecondario extends Thread{
    8
    9
    public void run(){
    10
    //istruzione1
    11
    //istruzione2
    12
    }
    13
    14
    }
    15
    16



    Il thread principale istanzia e avvia il thread secondario...Nel thread secondario viene eseguito il metodo run(), dopo che esegue le due istruzioni(istruzione1, istruzione2) il trhead secondario muore? o rimane attivo per un po?

  11. #10
    Androidiano L'avatar di iClaude76


    Registrato dal
    Oct 2012
    Località
    Trento
    Messaggi
    207
    Smartphone
    Galaxy S3, Nexus 7, G. Tab 2 7

    Ringraziamenti
    1
    Ringraziato 27 volte in 25 Posts
    Predefinito

    Appena eseguite le due istruzioni il thread secondario muore.

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