Autore Topic: servizio o asynctask  (Letto 722 volte)

Offline mrfalco

  • Utente junior
  • **
  • Post: 81
  • Respect: +2
    • Mostra profilo
    • www.falcodomingo.it
  • Dispositivo Android:
    Samsung Galazy S
  • Sistema operativo:
    Windows Vista
servizio o asynctask
« il: 12 Luglio 2011, 10:02:51 CEST »
0
ciao a tutti volevo sottoporre al forum una domanda.

Sto realizzando un'applicativo con diverse activity,all'apertura dell'apllicativo e per tutta la vita di esso vorrei che in un thread o servizio girassero 4 metodi.

per ora sto utilizzando un service in questo modo:

Codice (Java): [Seleziona]
         public class MyService extends Service{

                private static final long INTERVAL = 20000L;
         private Timer timer = new Timer();
                private WifiManager wifiManager;
                private String indirizzo=null;                
               @Override
         public IBinder onBind(Intent intent) {
                // TODO Auto-generated method stub
                return null;
        }

        @Override
        public void onCreate() {
                super.onCreate();
                //Toast.makeText(this, "Service creato...", Toast.LENGTH_LONG).show();
        }
   
       
        @Override
        public void onDestroy() {
                super.onDestroy();
                if (timer != null){            
                        timer.cancel();
                        Toast.makeText(this, "Servizio cancellato...", Toast.LENGTH_LONG).show();
                }
               
               @Override       
               public void onStart(Intent intent, int startid) {
                                      wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
                                      timer.scheduleAtFixedRate( new TimerTask() {

                        public void run() {
                        //Do whatever you want to do every “INTERVAL”
                                //Update.getLocalIpAddress() != null
                               
                                if(Update.getLocalIpAddress() != null) {       
                                        while (Update.getLocalIpAddress() == null){
                                                SystemClock.sleep(1000);
                                               
                                        }
                                       
                                       
                                                Medodo1();
                                                Medtodo2();
                                                Metodo_n();
                                                wifiManager.setWifiEnabled(false);
                                }
                        }
                       
                        }, 0, INTERVAL);
                        ; }
                                 {             
        }
                 
          }

Ovviamente ho dischiaro nel manifest il service.

Questo metodo andrebbe anche bene solo che non mi rispetta l'attesa dei 20 secondi.

grazie
« Ultima modifica: 12 Luglio 2011, 10:17:24 CEST da mrfalco »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:servizio o asynctask
« Risposta #1 il: 12 Luglio 2011, 10:12:11 CEST »
0
ctrl + shift + R... formatta il codice, come fai a capirci qualcosa con un codice così?  o_O

Comunque, il secondo parametro del metodo scheduleAtFixedRate serve a dirgli quanto tempo deve aspettare prima di far partire la prima volta il task.  Se tu gli metti 0 lui parte subito.

Offline mrfalco

  • Utente junior
  • **
  • Post: 81
  • Respect: +2
    • Mostra profilo
    • www.falcodomingo.it
  • Dispositivo Android:
    Samsung Galazy S
  • Sistema operativo:
    Windows Vista
Re:servizio o asynctask
« Risposta #2 il: 12 Luglio 2011, 10:21:30 CEST »
0
Ciao Grazie per la risposta ma il problema non è la partenza iniziale ma le successive volte so che il secondo valore vale per l'inizio, invece il terzo dovrebbere essere l'intervallo.
Grazie

Offline mrfalco

  • Utente junior
  • **
  • Post: 81
  • Respect: +2
    • Mostra profilo
    • www.falcodomingo.it
  • Dispositivo Android:
    Samsung Galazy S
  • Sistema operativo:
    Windows Vista
Re:servizio o asynctask
« Risposta #3 il: 12 Luglio 2011, 10:30:03 CEST »
0
..e comunque volevo sapere se è la migliore cosa il service oppure un Async task
grazie

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:servizio o asynctask
« Risposta #4 il: 12 Luglio 2011, 10:41:27 CEST »
0
Ciao,
forse ti avevo già risposto in  un precedente post, io utilizzerei il seguente codice:

Codice (Java): [Seleziona]
public final class DbSynchronizer {

        private final ScheduledExecutorService synchronizerTimer = Executors.newSingleThreadScheduledExecutor(new DaemonThreadFactory());
        private ScheduledFuture<?> synchronizerFuture = null;

        private final Activity activity;
        private final long delay;

        public DbSynchronizer(Activity activity, long delay) {
                this.activity= activity;
                this.delay= delay;
                startSyncTimer();
        }

        public void startSyncTimer() {
                cancel();
                synchronizerFuture = synchronizerTimer.schedule(new DbSynchronizerListener(this, activity), delay, TimeUnit.SECONDS);
        }

        private void cancel() {
                if (synchronizerFuture != null) {
                        synchronizerFuture.cancel(true);
                        synchronizerFuture = null;
                }
        }

        public void shutdown() {
                cancel();
                synchronizerTimer.shutdown();
        }

        private static final class DaemonThreadFactory implements ThreadFactory {
                public Thread newThread(Runnable runnable) {
                        Thread thread = new Thread(runnable);
                        thread.setDaemon(true);
                        return thread;
                }
        }

}

public final class DbSynchronizerListener implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener, Runnable {

        private final DbSynchronizer dbSynchronizer;
        private final Activity activity;

        public DbSynchronizerListener(DbSynchronizer dbSynchronizer, Activity activity) {
                this.dbSynchronizer = dbSynchronizer;
                this.activity= activity;
        }

        public void onCancel(DialogInterface dialogInterface) {
                run();
        }

        public void onClick(DialogInterface dialogInterface, int i) {
                run();
        }

        public void run() {
                activity.metodo1();
                ....;
                activity.metodoN();
                dbSynchronizer.startSyncTimer();
        }
}

nell'onCreate() dell' Activity principale basta che aggiungi il seguente codice e il thread inizia:

Codice (Java): [Seleziona]
long delay = 20; // per esempio 20 secondi
DbSynchronizer dbSynchronizerTimer = new DbSynchronizer(this, delay);

nell'onDestroy() fermi il thread:

Codice (Java): [Seleziona]
if (dbSynchronizerTimer != null) {
  dbSynchronizerTimer.shutdown();
}

La cosa è abbastanza semplice, basta che copi il codice sopra e implementi il metodo run() della classe DbSynchronizerListener a tuo piacimento.

PS: Io avevo chiamato le classi DbSynchronizer e DbSynchronizerListener perchè le utilizzavo per sincronizzare un db, ovviamente nel tuo caso dovrebbero avere qualche altro nome, per esempio ScheduledActivity e ScheduledActivityListener .

denper.
« Ultima modifica: 12 Luglio 2011, 10:45:04 CEST da denper »
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline mrfalco

  • Utente junior
  • **
  • Post: 81
  • Respect: +2
    • Mostra profilo
    • www.falcodomingo.it
  • Dispositivo Android:
    Samsung Galazy S
  • Sistema operativo:
    Windows Vista
Re:servizio o asynctask
« Risposta #5 il: 12 Luglio 2011, 11:47:48 CEST »
0
Grazie per la risposta ma volevo dirti che i metodi non hanno riferimenti a delle activity volevo a tal proposito chiederti se posso inserirli nel codice che mi hai mandato?

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:servizio o asynctask
« Risposta #6 il: 12 Luglio 2011, 12:01:18 CEST »
0
Certo, se fanno cose indipendenti dall'activity puoi inserirli come metodi privati all'interno del ScheduledActivityListener e poi li richiami nel run() della stessa classe.
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline mrfalco

  • Utente junior
  • **
  • Post: 81
  • Respect: +2
    • Mostra profilo
    • www.falcodomingo.it
  • Dispositivo Android:
    Samsung Galazy S
  • Sistema operativo:
    Windows Vista
Re:servizio o asynctask
« Risposta #7 il: 12 Luglio 2011, 13:02:39 CEST »
0
cIAO COME MAI mettendo un delay di 5 secondi i metodi vemngono eseguiti solo una volta?

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:servizio o asynctask
« Risposta #8 il: 12 Luglio 2011, 13:06:15 CEST »
0
Hai mantenuto l'ultimo comando sul metodo run()?
Codice (Java): [Seleziona]
dbSynchronizer.startSyncTimer();Prova ad aumentare il delay a 30 sec e verifica che l'operazione venga ripetuta. Una volta verificato che tutto funziona correttamente prova a dimunire il delay. Non vorrei che in 5 sec. le operazioni non venissero termiate....
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial