2015-04-20 18 views
5

Ho un MainActivity che utilizza i frammenti.Frammenti e discussioni in Android

L'onCreate di MainActivity completa il suo onCreate con l'uso di

welcomeFragment = new MyWelcomeFragment(); 
fr.beginTransaction().replace(R.id.mainContent, welcomeFragment).commit() 

Come parte della MyWelcomeFragment di su onResume, un thread viene avviato per ottenere gli aggiornamenti dal mio webserver. Se l'utente seleziona un'azione prima che il thread sia completato e passi a MyNewsFragment, cosa succede al thread che deve ancora essere completato nell'esecuzione dello stack di thread di MyWelcomeFragment?

discussione è stato creato con: (MyThread e conduttore sono le variabili di istanza)

myThread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        sendDataToServer(""); 
        handler = new Handler(Looper.getMainLooper()); 
        handler.post(new Runnable() { 
         public void run() { 
          onTaskDone(); 
         } 
        }); 
       } 
      }); 
      myThread.start(); 
+0

Che cos'è un * stack di thread *? – dcow

+1

Questo 'onTaskDone' potrebbe essere problematico se tenta di aggiornare le parti della vista e' Activity' è già finito. Perché non usi l'API 'AsyncTask' standard? –

+0

thread continuerà a essere eseguito fino a quando non completa l'attività – apk

risposta

2

Dalvik mantiene tutti i riferimenti di Thread nel runtime in modo che il thread continui a funzionare a meno che non venga terminato o completato (alcuni reference). Quindi, a seconda di dove si avvia la discussione, è possibile che ne venga creata più di una. C'è no clean way per cancellare una discussione e in questo caso potrebbe essere necessario prima annullare la richiesta http all'interno di sendDataToServer e utilizzare un flag condiviso per interrompere il thread.

In un quadro più ampio, vorrei suggerire

  • mossa il metodo di rete per attività e gestire la cosa lì dal momento che ha una durata maggiore rispetto Frammento
  • utilizzare Android Volley per gestire la rete. Con esso puoi gestire richieste multiple involontarie per inviare dati al tuo server. Poiché ogni richiesta può essere allegata al tag, è possibile annullare qualsiasi tag con un particolare tag nella coda (nel tuo caso quello corrispondente al processo sendDataToServer) prima di iniziarne uno nuovo.
  • e, infine, utilizzare il modello di sottotitolo di Publisher che è già stato reso disponibile da librerie come Otto o EventBus. Ciò consente la comunicazione tra frammenti o attività evitando problemi legati al ciclo di vita. In sintesi: un editore emette eventi per gli abbonati registrati e, a differenza degli ascoltatori, sia l'editore che l'abbonato sono totalmente disaccoppiati. Nel tuo caso, quando sendDataToServer è completato, non saprai se il frammento che contiene onTaskDone è ancora in circolazione. Se questo metodo manipola l'interfaccia utente mentre il frammento ha distrutto la sua visualizzazione, si otterrà sicuramente un errore. Quindi onTaskDone deve essere racchiuso all'interno di un metodo di sottoscrizione il cui frammento padre è registrato per l'editore di eventi http e cancellato non appena la sua vista viene distrutta.
0

Discussione continuerà a correre fino MyWelcomeFragment è vivo e Se non si uccide in onPause().

+0

Questo non è vero. Se non viene ucciso e ancora vivo, il filo continuerà a funzionare anche dopo che Frammento o Attività sono stati distrutti. – inmyth

1

Continuerà a funzionare fino al completamento del metodo run(), che è probabilmente per quanto tempo ci vuole a sendDataToServer ("") per completare, poiché il gestore dovrebbe essere abbastanza veloce rispetto all'IO di rete - o al thread è forza interrotta.

Sei ancora interessato al risultato se l'utente cambia i frammenti?

Stai mantenendo un riferimento al frammento di benvenuto? (Tramite il gestore di frammenti o l'attività): in tal caso, è comunque possibile accedere al risultato.

Se l'utente torna a dare il benvenuto al frammento, il riferimento del thread precedente verrà perso.

+0

Al termine dell'attività, i risultati vengono scritti nella pref condivisa e un conteggio viene aggiornato. Questo deve accadere solo quando il frammento è attivato, motivo per cui non è nell'attività principale. – justdan0227