Autore Topic: Istruzione ogni "Tot" di secondi  (Letto 4642 volte)

Offline Damix

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy 2 - HTC Sensetion
  • Sistema operativo:
    Windows 7 - Windows 8
Istruzione ogni "Tot" di secondi
« il: 22 Febbraio 2012, 14:00:16 CET »
0
Sono nuovo nel mondo della programmazione per Android e non so come fare a far eseguire un'istruzione ogni secondo...
Qualcuno sa aiutarmi??




Grazie  ;-)

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Istruzione ogni "Tot" di secondi
« Risposta #1 il: 22 Febbraio 2012, 14:14:31 CET »
+1
Non comprendo bene il significato di istruzione, ti riferisci ad una singola riga di codice o ad una serie di comandi (forse un membro della classe?)

Comunque:

1- o crei un Thread/Task che esegue l'istruzione e lo lanci una volta al secondo con un timer
2- crei un Thread/Task che esegue N operazioni (boh... all'interno di un ciclo?) e lo metti in sleep per 1 secondo dopo che hai eseguito l'istruzione.

In linea di principio ti consiglio il primo sistema è molto semplice sono poche righe di codice.

Lo inizializzi così:

Codice (Java): [Seleziona]
// Istanzi il tuo task
MioTask myTask = new MioTask();
// Istanzi il tuo timer
Timer myTimer = new Timer();
// Dici al tuo timer di lanciare il task la prima volta dopo un secondo
// (1000 millisecondi) e poi ad intervalli di un secondo
// (sempre 1000 millisecondi)
myTimer.schedule(myTask, 1000, 1000);

E all'interno della classe (o da un'altra parte) ti definisci MioTask:

Codice (Java): [Seleziona]
class MioTask extends TimerTask {
          public void run() {
                   // Qui ci va la tua istruzione...
          }
        }

 ;-)

Offline Damix

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy 2 - HTC Sensetion
  • Sistema operativo:
    Windows 7 - Windows 8
Re:Istruzione ogni "Tot" di secondi
« Risposta #2 il: 22 Febbraio 2012, 14:16:20 CET »
0
E' proprio quello che cercavo!!!  :D


Grazie mille!!!

Offline Damix

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy 2 - HTC Sensetion
  • Sistema operativo:
    Windows 7 - Windows 8
Re:Istruzione ogni "Tot" di secondi
« Risposta #3 il: 22 Febbraio 2012, 14:28:35 CET »
0

Questa istruzione mi da degli errori

Codice (Java): [Seleziona]
 myTimer.schedule(myTask, 1000, 1000);

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:Istruzione ogni "Tot" di secondi
« Risposta #4 il: 22 Febbraio 2012, 14:49:39 CET »
0
TimerTask in Android da dei problemi , non funziona benissimo, procrdi in questa maniera:

_implementa un' interfaccia Runnable con all' interno l' istruzione che vuoi ripetere, in questa maniera:

Codice (Java): [Seleziona]
 private Runnable runnable = new Runnable()
        {

                @Override
                public void run( )
                {
                        Tua_Istruzione( );
                        handler.postDelayed( this, periodo );
                }
        };

-creai un Handler che gestisce la comunicazione tra il Thread dove stai lavorando e il Runnable:
Codice (Java): [Seleziona]
 Handler handler = new Handler( )
            {
                @Override
                public void handleMessage( Message msg )
                {
                       Tuo_Messaggio(Ad asempio: Logi(TAG,msg.obj.toString( )))

                }
        };//Handler

Quando desideri all' interno della tua Activity richiami il metodo
Codice (Java): [Seleziona]
handler.postDelayed( runnable, startUp );Dove :
-runnable, è quello creato in precedenza;
-startUp sono i millisecondi di attesa prima di far partire il Runnable(puoi direttamente inserire il numero ad esempio:5000=5 secondi)

Il metodo
Codice (Java): [Seleziona]
handler.postDelayed( this, periodo );, che prima ho inserito dentro al runnable provvederà a ripetere l' istruzione ogni tot (periodo) secondi.
Spero di essere stato chiaro...
Ciao
Morotti Alessio

Offline Damix

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy 2 - HTC Sensetion
  • Sistema operativo:
    Windows 7 - Windows 8
Re:Istruzione ogni "Tot" di secondi
« Risposta #5 il: 22 Febbraio 2012, 14:56:00 CET »
0
TimerTask in Android da dei problemi , non funziona benissimo, procrdi in questa maniera:

_implementa un' interfaccia Runnable con all' interno l' istruzione che vuoi ripetere, in questa maniera:

Codice (Java): [Seleziona]
 private Runnable runnable = new Runnable()
        {

                @Override
                public void run( )
                {
                        Tua_Istruzione( );
                        handler.postDelayed( this, periodo );
                }
        };

-creai un Handler che gestisce la comunicazione tra il Thread dove stai lavorando e il Runnable:
Codice (Java): [Seleziona]
 Handler handler = new Handler( )
            {
                @Override
                public void handleMessage( Message msg )
                {
                       Tuo_Messaggio(Ad asempio: Logi(TAG,msg.obj.toString( )))

                }
        };//Handler

Quando desideri all' interno della tua Activity richiami il metodo
Codice (Java): [Seleziona]
handler.postDelayed( runnable, startUp );Dove :
-runnable, è quello creato in precedenza;
-startUp sono i millisecondi di attesa prima di far partire il Runnable(puoi direttamente inserire il numero ad esempio:5000=5 secondi)

Il metodo
Codice (Java): [Seleziona]
handler.postDelayed( this, periodo );, che prima ho inserito dentro al runnable provvederà a ripetere l' istruzione ogni tot (periodo) secondi.
Spero di essere stato chiaro...
Ciao
Non ho molto capito questo procedimento..

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:Istruzione ogni "Tot" di secondi
« Risposta #6 il: 22 Febbraio 2012, 15:07:17 CET »
0
In particolare?
Morotti Alessio

Offline Damix

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy 2 - HTC Sensetion
  • Sistema operativo:
    Windows 7 - Windows 8
Re:Istruzione ogni "Tot" di secondi
« Risposta #7 il: 22 Febbraio 2012, 15:08:15 CET »
0
Mi da errori

Offline Damix

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy 2 - HTC Sensetion
  • Sistema operativo:
    Windows 7 - Windows 8
Re:Istruzione ogni "Tot" di secondi
« Risposta #8 il: 22 Febbraio 2012, 15:10:17 CET »
0
Non comprendo bene il significato di istruzione, ti riferisci ad una singola riga di codice o ad una serie di comandi (forse un membro della classe?)

Comunque:

1- o crei un Thread/Task che esegue l'istruzione e lo lanci una volta al secondo con un timer
2- crei un Thread/Task che esegue N operazioni (boh... all'interno di un ciclo?) e lo metti in sleep per 1 secondo dopo che hai eseguito l'istruzione.

In linea di principio ti consiglio il primo sistema è molto semplice sono poche righe di codice.

Lo inizializzi così:

Codice (Java): [Seleziona]
// Istanzi il tuo task
MioTask myTask = new MioTask();
// Istanzi il tuo timer
Timer myTimer = new Timer();
// Dici al tuo timer di lanciare il task la prima volta dopo un secondo
// (1000 millisecondi) e poi ad intervalli di un secondo
// (sempre 1000 millisecondi)
myTimer.schedule(myTask, 1000, 1000);

E all'interno della classe (o da un'altra parte) ti definisci MioTask:

Codice (Java): [Seleziona]
class MioTask extends TimerTask {
          public void run() {
                   // Qui ci va la tua istruzione...
          }
        }

 ;-)



Codice (Java): [Seleziona]
MioTask myTask = new MioTask();
               
                Timer myTimer = new Timer();
               

                class MioTask extends TimerTask {
                    public void run() {  
                       
                        myTimer.schedule(myTask, 1000, 1000);
                       
                    }
                  }
Usato così??

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Istruzione ogni "Tot" di secondi
« Risposta #9 il: 22 Febbraio 2012, 15:11:58 CET »
0
Questa istruzione mi da degli errori

Codice (Java): [Seleziona]
 myTimer.schedule(myTask, 1000, 1000);
Che errore ti da?

Offline Damix

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy 2 - HTC Sensetion
  • Sistema operativo:
    Windows 7 - Windows 8
Re:Istruzione ogni "Tot" di secondi
« Risposta #10 il: 22 Febbraio 2012, 15:14:12 CET »
0
Che errore ti da?

Di sintassi...

Ma l'istruzione
Codice (Java): [Seleziona]
myTimer.schedule(myTask, 1000, 1000); Dove va messa??

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Istruzione ogni "Tot" di secondi
« Risposta #11 il: 22 Febbraio 2012, 15:19:31 CET »
0
Verifica di avere gli import

Codice (Java): [Seleziona]
import java.util.Timer;
import java.util.TimerTask;

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:Istruzione ogni "Tot" di secondi
« Risposta #12 il: 22 Febbraio 2012, 15:24:44 CET »
0
Io intendo di togliere interamente il codice che hai inserito , e inserire quello che ho postato io per intero.
Ho avuto lo stesso problema , ho risolto così .....
Morotti Alessio

Offline Essio

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • alessiomorotti
    • Mostra profilo
  • Dispositivo Android:
    vodafone 848-SAMSUNG GALAXY Tab
  • Sistema operativo:
    Window Vista
Re:Istruzione ogni "Tot" di secondi
« Risposta #13 il: 22 Febbraio 2012, 15:33:26 CET »
0
Leggi questo articolo:http://cart.kolix.de/?p=1438, è grazie a questo che ho risolto....
TimerTask è sconsigliato per Android!
Morotti Alessio

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Istruzione ogni "Tot" di secondi
« Risposta #14 il: 22 Febbraio 2012, 15:56:03 CET »
0
@Damix:

La sintassi è sbagliata perchè chiami lo scheduling all'interno della run ma siccome la run viene fatta partire dallo schedule non può funzionare e tra l'altro non dovresti nemmeno accedere al timer.

Dove ci sono gli import aggiungi gli import per Timer e TimerTask.
Per fare una prova nella onCreate ci metti

Codice (Java): [Seleziona]
// Istanzi il tuo task
MioTask myTask = new MioTask();
// Istanzi il tuo timer
Timer myTimer = new Timer();
// Dici al tuo timer di lanciare il task la prima volta dopo un secondo
// (1000 millisecondi) e poi ad intervalli di un secondo
// (sempre 1000 millisecondi)
myTimer.schedule(myTask, 1000, 1000);

E nella classe definisci MioTask

Codice (Java): [Seleziona]
class MioTask extends TimerTask {
                    public void run() {  
                        // Qui NON ci va lo schedule, ma la tua istruzione                        
                    }
                  }

@Essio:

In Android i Task hanno problemi????

Ho fatto un progetto di prova in eclipse, provaschedule (package com.io.provaschedule) e ho scritto questo codice qua:

Codice (Java): [Seleziona]
package com.io.provaschedule;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class ProvascheduleActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // Istanzi il tuo task
        MioTask myTask = new MioTask();
        // Istanzi il tuo timer
        Timer myTimer = new Timer();
        // Dici al tuo timer di lanciare il task la prima volta dopo un secondo
        // (1000 millisecondi) e poi ad intervalli di un secondo
        // (sempre 1000 millisecondi)
        myTimer.schedule(myTask, 1000, 1000);
    }
   
    class MioTask extends TimerTask {
        public void run() {
                 // Qui ci va la tua istruzione... provo a scrivere un log
                Log.i("io", "ioio");
               
        }
      }
}

E da logcat fa quello che deve fare, cioè mi esegue il log una volta al secondo!!!

Se fate un progetto di prova chiamato provaschedule (package com.io.provaschedule) e copiaincollate quello che ho messo qua sopra DEVE funzionare.

Ho letto l'articolo, dice due cose OVVIE:
1- se si deve aggiornare la UI un timertask non è il modo più efficiente
2- ci sono problemi di risoluzione se vuoi lanciare un task ogni secondo per aggiornare il tempo sulla UI

Questo significa (o almeno così lo interpreto io) che se tu chiami un timertask ogni secondo è possibile che venga chiamato al secondo 9.1, poi al 9.9 e poi all'11.0. Ovvero se gli metti una precisione di un secondo ti ritrovi ad avere l'elemento della UI fermo a 9 per 2 secondi.

Bella forza... non mi aspettavo certo che il timertask fosse chiamato con precisione al millisecondo!

Ma ad onor del vero non mi risulta che negli articoli in cui si suggerisce di usare un handler si metta precisione ad 1 secondo, anzi la mettono comunque a 100-200 millisecondi. Sarà mica che indipendentemente dal metodo non ci si può aspettare una precisione al millisecondo?  :-P

Poi sarà anche scritto sul sito ufficiale Android con tutto il resto che ne consegue (cioè che ovviamente io sono un tizio qualunque al contrario dell'autore dell'articolo) ma l'unica cosa che quell'articolo mi dice è che ci sono modi più leggeri (migliori) per aggiornare un elemento della UI.

 :-)