2013-08-15 10 views
10

Sono molto nuovo alla programmazione Android quindi per favore perdona la mia noobie-ness. Sto provando a creare un'attività molto semplice che avrà un TextView nel mezzo del layout e semplicemente passerà a un testo diverso ogni due secondi. Ad esempio, TextView pronuncerà "text1", metterà in pausa per un paio di secondi, quindi dirà "text2" e metterà nuovamente in pausa. Infine, voglio aggiungere altri testi e farli scorrere tutti uno dopo l'altro. cosa semplicissima, ma in questo momento cerco principalmente di conoscere thread e gestori. Comunque, ho letto su come dovremmo tenere le cose lunghe fuori dal thread dell'interfaccia utente per prevenire un errore, quindi ho pensato che avrei usato un gestore . semplicemente passare da 2 testi sullo schermo Purtroppo, non posso arrivare a questo lavoro Ecco po 'di codice:.Pausa con handler e postDelayed in android

public class MainActivity extends Activity { 

String[] myarray = {"text1" , "text2"}; 
int arraylength = myarray.length; 
int count; 
Handler handler = new Handler(); 

TextView mytexts; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mytexts = (TextView)findViewById(R.id.my_texts); 
    mytexts.setText(myarray[0]); 

    Thread t = new Thread(new Runnable(){ 
     public void run() { 
      for (int count = 0; count < arraylength; count++){ 
       handler.postDelayed(new Runnable(){ 
        public void run() { 
         mytexts.setText(myarray[1]); 
        }     
       }, 7000); 
      } 
     } 
    }); 
    t.start(); 
    } 
} 

da quello che posso vedere nel logcat, il gestore sembra funzionare postDelayed una dopo l'altra (nel mio caso del codice, NON aspira 7 secondi con PostDelay per fare un altro postDelayed). Inoltre, vorrei fare il 1 in "mytexts.setText (myar ray [1]); "essere uguale a" count "nel ciclo for in modo che possa essere uguale a una delle stringhe dell'array ma ciò mi dà un errore. Sono rimasto bloccato per ore e altri esempi che ho trovato online sembrano troppo complicati per uno come me che vuole soprattutto ottenere le basi prima di poter affrontare altre cose. Qualsiasi aiuto con qualsiasi cosa sarebbe molto apprezzato. Grazie.

+0

Perché non si rimuove il 'postDelayed' e utilizzare un' POST' con un 'while' e poi fare un po' Discussione .sleep (tempo) '? –

+0

@RotaryHeart il metodo postDelay pubblicherà il codice da eseguire sul thread principale dopo il ritardo. Non hai bisogno di dormire la discussione. In questo caso particolare non ha assolutamente bisogno del Thread! – Ali

+0

@Ali Sì, hai ragione, non volevo cambiare il suo codice, ma per dirgli come farlo con quel codice. –

risposta

19

postDelayed non è bloccante, il che significa che lo aggiungerebbe a una coda. Lo farò in seguito. Quindi quello che probabilmente stai vedendo sono tutti gli aggiornamenti di testo che avvengono insieme al 7 ° secondo. Dico questo perché sei il postDelay dal metodo onCreate quando in realtà probabilmente vuoi farlo da onResume o anche da onPostResume.

Inoltre, non vi è alcun motivo per creare un thread per aggiungere i runnable alla coda dei messaggi. Il codice dovrebbe essere più simile a questo: (Nota Il tempo per ritardare moltiplicatore)

@Override 
protected void onResume() { 
    super.onResume(); 
    for (int count = 0; count < arraylength; count++){ 
     handler.postDelayed(new Runnable(){ 
      @Override 
      public void run() { 
       mytexts.setText(myarray[count]); 
      } 
     }, 7000 * (count + 1)); 
    } 
} 
+0

Sì, tutti gli aggiornamenti di testo stanno accadendo al 7 ° secondo. Sono un po 'incerto sul motivo per cui non ho bisogno di creare un nuovo thread, però. PostDelayed esegue automaticamente l'attesa di 7 secondi in un thread in background? So che questa attesa potrebbe causare un errore nell'interfaccia utente, motivo per cui inizialmente pensavo di aver bisogno di una nuova discussione. –

+0

Ce l'hai, sarebbe "aspetta" al di fuori del thread corrente (UI). – JRomero

+0

Fantastico. Ciò cancella tutto. Molte grazie. –

2

Questo perché il ciclo imposta tutti i gestori per l'esecuzione dopo 7 secondi non 7 secondi l'uno dopo l'altro ma dopo 7 secondi da ora. È possibile aggiungere il metodo postDelayed o utilizzare il metodo postAtTime nel gestore.

Inoltre, non è necessario eseguire questa operazione in una discussione, è possibile eliminarla del tutto.

Problemi correlati