Autore Topic: Come faccio a variare il period di un Timer in determinate condizioni?  (Letto 893 volte)

Offline zipgenius

  • Utente junior
  • **
  • Post: 80
  • Respect: +17
    • matteoriso
    • Mostra profilo
    • ZipGenius
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Wininizio.it Software
  • Sistema operativo:
    Windows 7
Ciao.
Ho creato un service che ogni 10 minuti scarica tre feed RSS da un sito e li salva in una cartella, però vorrei fare in modo che il timer, impostato ad eseguire l'azione ogni 10 minuti (600000 millisecondi), sia settato a ripetere l'azione dopo soli 60 secondi nel caso che nell'esecuzione precedente non sia rilevata alcuna connessione di rete.

Il codice usato è il seguente:

Codice (Java): [Seleziona]
public class myservice extends Service {
        private final long mDelay = 0;
        private long mPeriod = 600000;
        private final String LOGTAG = "MyService";       
        private Timer mTimer;
       
        private boolean isNetworkAvailable() {
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            return activeNetworkInfo != null;
        }
       
        private class LogTask extends TimerTask {
                public void run() {                    
                        if (isNetworkAvailable()) {
                                Log.i(LOGTAG, "Feeds download...");
                                DownloadRSS();                         
                        } else {
                                Log.e(LOGTAG, "NO NETWORK! Checking back in 1 minute...");
                        }
                }
         }
       
        private LogTask mLogTask;
        @Override
        public IBinder onBind(final Intent intent) {
                return null;
        }
         
        @Override
        public void onCreate() {
                super.onCreate();
                Log.i(LOGTAG, "Service created");
                mTimer = new Timer();
                mLogTask = new LogTask();      
        }
         
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {     
                super.onStart(intent, startId);
                Log.i(LOGTAG, "Service started");
                if (!isNetworkAvailable()) {                   
                        mTimer.schedule(mLogTask, mDelay, 60000);
                } else {
                        mTimer.schedule(mLogTask, mDelay, mPeriod);
                }
                return START_NOT_STICKY;
        }
       
    @Override
    public void onDestroy()
    {
        Log.v(LOGTAG, "Service stopped");
        stopSelf();    
    }
       
        public void DownloadRSS() {  //this is the downloader method           
        try {
                File dir = new File(Environment.getExternalStorageDirectory() + "/myapp");
            if(!dir.exists())
                dir.mkdirs();
                // Download RSS Notizie
            URL url = new URL(main.rssurl);
            File file = new File(main.RSSFile);
            long startTime = System.currentTimeMillis();
            URLConnection ucon = url.openConnection();
            InputStream is = ucon.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            ByteArrayBuffer baf = new ByteArrayBuffer(50);
            int current = 0;
            while ((current = bis.read()) != -1) {
                baf.append((byte) current);
            }
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(baf.toByteArray());
            fos.close();
           
        } catch (IOException e) {
                Log.d("MyApp", "Error: " + e);
        }
    }
}

Se avvio il servizio senza le connessioni di rete attive al log viene aggiunta la nota per cui non è stata rilevata alcuna connessione di rete e il servizio non procede al download dei files; se attivo le connessioni di rete, però, il download avviene ogni minuto e non ogni dieci come progettato.

Dov'è che sbaglio? Avete soluzioni alternative?


Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come faccio a variare il period di un Timer in determinate condizioni?
« Risposta #1 il: 10 Maggio 2011, 23:36:56 CEST »
+1
Io farei due timer: uno che in ogni caso ogni minuto controlla la connessione e attiva/disattiva l'altro che scarica i dati.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Come faccio a variare il period di un Timer in determinate condizioni?
« Risposta #2 il: 11 Maggio 2011, 09:40:55 CEST »
+1
appoggio la soluzione di Ricky.
Comunque, puoi sempre variare l'intervallo ad ogni chiamata, evitando di temporizzarlo in maniera fissa.

In ogni caso, ti consiglio l'utilizzo di un handler: leggiti questo.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline zipgenius

  • Utente junior
  • **
  • Post: 80
  • Respect: +17
    • matteoriso
    • Mostra profilo
    • ZipGenius
  • Dispositivo Android:
    Samsung Galaxy S
  • Play Store ID:
    Wininizio.it Software
  • Sistema operativo:
    Windows 7
Re:Come faccio a variare il period di un Timer in determinate condizioni?
« Risposta #3 il: 11 Maggio 2011, 15:22:51 CEST »
0
appoggio la soluzione di Ricky.
Comunque, puoi sempre variare l'intervallo ad ogni chiamata, evitando di temporizzarlo in maniera fissa.

In ogni caso, ti consiglio l'utilizzo di un handler: leggiti questo.
Infatti ho letto proprio quell'articolo e ho risolto così:
Codice (Java): [Seleziona]
private Runnable runnable = new Runnable() {
                @Override
                public void run() {
                        if (isNetworkAvailable()) {
                                Log.i(LOGTAG, "Feeds download...");
                                DownloadRSS();
                                handler.postDelayed(this, 600000);
                        } else {
                                Log.e(LOGTAG, "NO NETWORK: retrying in 1 minute.");
                                handler.postDelayed(this, 60000);
                        }
                }
        };

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Come faccio a variare il period di un Timer in determinate condizioni?
« Risposta #4 il: 13 Maggio 2011, 10:49:27 CEST »
0
good!
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/