2012-01-07 12 views

risposta

21

Probabilmente si desidera controllare TimerTask

Dal momento che ti ha portato questa volta vorrei fare una raccomandazione diversa, che è un Handler. È più semplice da utilizzare rispetto a TimerTask poiché non è necessario chiamare esplicitamente runOnUiThread poiché il gestore sarà associato al thread dell'interfaccia utente purché sia ​​creato sul thread dell'interfaccia utente o lo crei utilizzando il looper principale nel costruttore. Sarebbe funziona così:

private Handler mHandler; 
Runnable myTask = new Runnable() { 
    @Override 
    public void run() { 
    //do work 
    mHandler.postDelayed(this, 1000); 
    } 
} 

@Override 
public void onCreate(Bundle savedState) { 
    super.onCreate(savedState); 
    mHandler = new Handler(Looper.getMainLooper()); 
} 
//just as an example, we'll start the task when the activity is started 
@Override 
public void onStart() { 
    super.onStart(); 
    mHandler.postDelayed(myTask, 1000); 
} 

//at some point in your program you will probably want the handler to stop (in onStop is a good place) 
@Override 
public void onStop() { 
    super.onStop(); 
    mHandler.removeCallbacks(myTask); 
} 

ci sono alcune cose di essere a conoscenza con i gestori nella vostra attività:

  1. La vostra attività può essere shutdown/non visibile in tutta gestore è ancora in esecuzione, se si don interromperlo su onStop (o onPause se lo avvii su onResume), questo porterà a problemi se si tenta di aggiornare l'interfaccia utente
  2. Se il telefono va in modalità di sospensione profonda, gli handler non si attivano tutte le volte che si ha specificato. Lo so perché ho eseguito alcuni test approfonditi con i dispositivi bluetooth per testare la connettività dopo molte ore di funzionamento e ho utilizzato i gestori insieme alle stampe dei log ogni volta che hanno sparato.
  3. Se è necessario mantenere questo timer, è consigliabile inserirlo in un servizio che durerà più a lungo di un'attività. Registra la tua attività con il servizio (implementando un'interfaccia definita nel servizio per la comunicazione con il servizio).
+0

Collegamento non funzionante. – laarsk

+1

risolto per voi. –

+0

Grazie per quello! :) – laarsk

11

Questo è il codice che ho utilizzato nel mio progetto corrente. Ho usato TimerTask come diceva Matt. 60000 è il milisec. = 60 sec. l'ho usato per aggiornare i punteggi delle partite.

private void refreshTimer() { 
     autoUpdate = new Timer(); 
     autoUpdate.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       runOnUiThread(new Runnable() { 
        public void run() { 
         adapter = Score.getScoreListAdapter(getApplicationContext()); 
         adapter.forceReload(); 
         setListAdapter(adapter); 
        } 
       }); 
      } 
     }, 0, 60000); 
+0

Non funziona. CHE COSA significa autoaggiornamento? e runOnUiThread. Minus – l0gg3r

+3

Queste domande sono appena rilevanti, l0gg3r. Ha fornito un esempio di un'attività pianificata per essere eseguita dopo 60 secondi, sul thread dell'interfaccia utente. Qualsiasi sviluppatore Android dovrebbe comprendere facilmente il codice. –

+0

Una cosa, però, @GiantRobot. Questo esempio si comporta più come setInterval di setTimeout. Le modifiche necessarie per utilizzare questo codice per setTimeout potrebbero essere: modificare l'ordine dei valori (60000, 0 anziché 0, 60000) e arrestare il timer nella funzione run(), in modo che venga eseguito solo una volta. –

1

C'è del metodo setTimeout() in underscore-java biblioteca.

Codice esempio:

import com.github.underscore.lodash.$; 
import com.github.underscore.Function; 

public class Main { 

    public static void main(String[] args) { 
     final Integer[] counter = new Integer[] {0}; 
     Function<Void> incr = new Function<Void>() { public Void apply() { 
      counter[0]++; return null; } }; 
     $.setTimeout(incr, 100); 
    } 
} 

La funzione sarà avviato in 100 ms con un nuovo thread.

1

Come continuazione di Valentyn risposta utilizzando Java sottolineatura:

Aggiungi dipendenza Gradle:

dependencies { 
    compile group: 'com.github.javadev', name: 'underscore', version: '1.15' 
} 

Java:

import com.github.underscore.lodash.$; 

$.setTimeout(new Function<Void>() { 
    public Void apply() { 
     // work 
     return null; 
    } 
}, 1000); // 1 second 
Problemi correlati