Autore Topic: Fermare un thread in una diversa activity  (Letto 749 volte)

Offline InterDroid

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Alcatel onetouch 993d
  • Sistema operativo:
    Windows 8.1
Fermare un thread in una diversa activity
« il: 24 Aprile 2014, 09:16:05 CEST »
0
Ciao a tutti,

ho il seguente problema: devo creare un thread in un'activity A e fermarlo in un'activity B.Come faccio?
Activity A

Codice (Java): [Seleziona]
Rec rec = new Rec();      
     rec.start();          
     rec.startRecording();

dove Rec è un thread
Codice (Java): [Seleziona]
public class Rec extends Thread{

        public void Rec(Context context) {
        this.mContext = context;

    }

 @Override
 public void run(){
     .....}

 public void startRecording(){
     .....}
 public void stopRecording(){
     .....}

devo utilizzare il metodo stopRecording() nell'activity B.
Grazie

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:Fermare un thread in una diversa activity
« Risposta #1 il: 24 Aprile 2014, 10:04:37 CEST »
0
Intanto una raccomandazione: se i metodi start/stopRecording sono invocati (come sembra) esternamente al thread e se sono potenzialmente accessibili da più di un thread esterno, dovrebbero essere synchronized.

Poi eviterei di fermare il thread distruggendolo, perchè non sai come si ferma e come lascia le variabili/dati con cui sta interagendo. E' buono il metodo stopRecording, che imposta una variabile booleana di stop, la quale viene controllata dal loop del thread (quello in run()) e se è vera fa terminare naturalmente il loop.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline InterDroid

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Alcatel onetouch 993d
  • Sistema operativo:
    Windows 8.1
Re:Fermare un thread in una diversa activity
« Risposta #2 il: 24 Aprile 2014, 10:23:55 CEST »
0
Grazie.
Il thread devo distruggerlo per forza perchè deve essere creato un altro thread che utilizza il medesimo canale audio e quindi i 2 andrebbero in conflitto.
Il metodo stopRecording() non l'avevo pensato per fermare il thread, ma solo per effettuare un salvataggio periodico del segnale audio in ingresso.Nell'activity B devo invocare un'altro metodo che mi distrugga l'oggetto.
Il mio problema in particolare è : nell'activity B come faccio ad invocare il metodo stopRecording() ?
Mi spiego meglio:
Per invocare questo metodo dovrei scrivere:

Activity B
Codice (Java): [Seleziona]
Rec rec;

rec.stopRecording();

ma l'app mi va naturalmente in crash. Questo modo di agire è sicuramente sbagliato e quindi non so come passare il riferimento al thread precedentemente creato e su di esso invocare il metodo stopRecording(); Basta impostare "synchronized" nella dichiarazione dei 2 metodi?
« Ultima modifica: 24 Aprile 2014, 10:28:55 CEST da InterDroid »

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:Fermare un thread in una diversa activity
« Risposta #3 il: 24 Aprile 2014, 11:13:01 CEST »
+1
Distruggere forzosamente un thread è cattiva programmazione, può portare a crash inattesi e corruzione di dati.

Soprattutto visto che è evitabile, ad esempio con un metodo stopThread (visto che stopRecording serviva ad altro) che avrà l'effetto di fare uscire il thread dal loop infinito in run() e fargli rilasciare i canali audio e tutte le risorse che aveva impegnato.

Il riferimento al thread è qualcosa che devi salvarti al momento in cui lo crei, ad esempio estendendo l'oggetto Application, così che sia accessibile anche da altre activity.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline InterDroid

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Alcatel onetouch 993d
  • Sistema operativo:
    Windows 8.1
Re:Fermare un thread in una diversa activity
« Risposta #4 il: 24 Aprile 2014, 12:05:01 CEST »
0
si, era proprio quello che intendevo fare a proposito del metodo stopThread().
Vedrò di studiarmi come estendere l'oggetto application allora. Grazie

iClaude

  • Visitatore
Re:Fermare un thread in una diversa activity
« Risposta #5 il: 24 Aprile 2014, 12:45:06 CEST »
0
Secondo me in questi casi la best practice è quella di utilizzare un Service, anche per slegare il ciclo di vita della Activity da quello del thread sottostante.
Inoltre utilizzare la classe Thread di Java è altamente sconsigliato: molto meglio utilizzare gli strumenti standard di Android, vale a dire AsyncTask o Handler.

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:Fermare un thread in una diversa activity
« Risposta #6 il: 24 Aprile 2014, 12:59:14 CEST »
0
Secondo me in questi casi la best practice è quella di utilizzare un Service, anche per slegare il ciclo di vita della Activity da quello del thread sottostante.

Attenzione che usare un Service non vuol dire automaticamente slegarsi dal main-thread.

Copio-incollo da : Services | Android Developers
Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise). This means that, if your service is going to do any CPU intensive work or blocking operations (such as MP3 playback or networking), you should create a new thread within the service to do that work.


Inoltre utilizzare la classe Thread di Java è altamente sconsigliato: molto meglio utilizzare gli strumenti standard di Android, vale a dire AsyncTask o Handler.

In realtà non c'è molta differenza, dato che gli AsyncTask non sono altro che un wrapper su un pool di Thread.

Copio-incollo da AsyncTask | Android Developers
AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.)

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

iClaude

  • Visitatore
Re:Fermare un thread in una diversa activity
« Risposta #7 il: 24 Aprile 2014, 14:56:14 CEST »
0
Ovviamente all'interno del Service vanno creati gli eventuali thread che servono.
Questi casi (riproduzioni o registrazioni in background) sono i casi classici in cui si utilizzano i Service, anche all'interno di un'unica Activity per il motivo già citato: il Service non deve essere influenzato dal ciclo di vita della Activity (pressioni del tasto home o altro).
Direi che un binding Service cui si connettono le varie Activity che lo usano è la soluzione migliore.
« Ultima modifica: 24 Aprile 2014, 15:06:02 CEST da iClaude »