Autore Topic: Timer (o Runnable) ogni 200 millisecondi con modifica della UI  (Letto 1152 volte)

Offline Giacomo79

  • Utente junior
  • **
  • Post: 123
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Play Store ID:
    Big and Fish
  • Sistema operativo:
    Android 2.3
Timer (o Runnable) ogni 200 millisecondi con modifica della UI
« il: 11 Dicembre 2013, 01:09:36 CET »
0
Salve a tutti,
ho bisogno di un timer che scatti ogni 200 millisecondi e che ad ogni step modifichi la UI.
E' performante usare il timer (con le problematiche del caso, cioè di utilizzare un handler per modificare la UI visto che il timer crea un altro thread) o è preferibile una variabile Runnable richiamata continuamente con postDelayed?

Grazie

iClaude

  • Visitatore
Re:Timer (o Runnable) ogni 200 millisecondi con modifica della UI
« Risposta #1 il: 11 Dicembre 2013, 15:57:56 CET »
0
Su Android la soluzione migliore è quella di utilizzare un Handler collegato al Looper del thread principale.
Sto preparando proprio ora un breve tutorial che pubblicherò a giorni.
Da evitare come la peste Timer, pensato per Java ma che mal si adatta ad Android.

Offline Giacomo79

  • Utente junior
  • **
  • Post: 123
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Play Store ID:
    Big and Fish
  • Sistema operativo:
    Android 2.3
Re:Timer (o Runnable) ogni 200 millisecondi con modifica della UI
« Risposta #2 il: 12 Dicembre 2013, 15:40:56 CET »
0
Su Android la soluzione migliore è quella di utilizzare un Handler collegato al Looper del thread principale.
Sto preparando proprio ora un breve tutorial che pubblicherò a giorni.
Da evitare come la peste Timer, pensato per Java ma che mal si adatta ad Android.
Un piccolo esempio pratico prima del tutorial?

Sto cercando in giro ma non riesco a capire come fare.

Post unito: 12 Dicembre 2013, 15:49:28 CET
Qualcosa del genere:
Codice (Java): [Seleziona]
protected Handler mainHandler = new Handler(Looper.getMainLooper()) {
                public void handleMessage(Message message) {
                        switch (message.what) {
                        case MSG_TIMER:
                                sendMessageDelayed(message, 200);
                                break;

                        case MSG_ENDQUESTION:
                                gotoNext();
                                break;
                        }
                }
        };
« Ultima modifica: 12 Dicembre 2013, 15:49:28 CET da Giacomo79, Reason: Merged DoublePost »

iClaude

  • Visitatore
Re:Timer (o Runnable) ogni 200 millisecondi con modifica della UI
« Risposta #3 il: 13 Dicembre 2013, 10:26:49 CET »
0
Per prima cosa crei l'handler associato al main looper:

mMainHandler = new Handler(getMainLooper(), this);

Lo lanci inviando un Message:

mMainHandler.sendEmptyMessage(ATTIVA_CICLO);

La tua Activity deve implementare Handler.Callback.
Implementi i metodo handleMessage, dove ricavi il campo message.what, verifichi che si tratti di ATTIVA_CICLO, e lanci il tuo metodo.

Nel tuo metodo esegui le operazioni che devi fare, quindi alla fine lo richiami in modo ricorsivo con un comando del tipo:
mMainHandler.sendEmptyMessageDelayed(ATTIVA_CICLO, 200);

Ovviamente poi in onPause deve rimuovere i messaggi in corso, tipo:

mMainHandler.removeMessages(ATTIVA_CICLO);

Questo a grandi linee.

Offline Giacomo79

  • Utente junior
  • **
  • Post: 123
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Play Store ID:
    Big and Fish
  • Sistema operativo:
    Android 2.3
Re:Timer (o Runnable) ogni 200 millisecondi con modifica della UI
« Risposta #4 il: 13 Dicembre 2013, 10:47:53 CET »
0
Perfetto, alcuni dubbi:
- A me serve che il messaggio non sia vuoto, quindi uso sendMessageDelayed. Non c'è differenza, giusto?
- Nel ciclo sto provando a ridisegnare un'immagine, ma ho un comportamento strano. Può essere che i messaggi siano troppo veloci e l'onDraw dell'ImageView faccia casino?

iClaude

  • Visitatore
Re:Timer (o Runnable) ogni 200 millisecondi con modifica della UI
« Risposta #5 il: 13 Dicembre 2013, 12:55:11 CET »
0
Come avrai visto puoi inviare messaggi vuoti o impostare dei valori su arg1 e arg1, e anche inviare degli oggetti complessi.