2012-03-16 9 views
5

Desidero creare un'app, che cambierebbe lo sfondo del dispositivo Android a intervalli fissi, diciamo ogni ora circa. Attualmente nel mio codice, avvio un servizio e sto usando un oggetto Timer. L'oggetto Timer verrebbe invocato a intervalli regolari e cambierà lo sfondo.Applicazione Android per cambiare lo sfondo a intervalli regolari utilizzando Timer

Questo è il codice che sto utilizzando attualmente. Lo sfondo viene cambiato solo una volta e non dopo. Per favore fatemi sapere cosa dovrei fare?

public class Wallpaper extends Service { 

    Timer mytimer; 
    int interval=60000; 
    Drawable drawable; 
    WallpaperManager wpm; 
    int prev=1; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mytimer=new Timer(); 
     wpm=WallpaperManager.getInstance(Wallpaper.this); 
    } 



    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     mytimer.schedule(new TimerTask() { 
      @Override 
      public void run() { 

       if(prev==1){ 
        drawable = getResources().getDrawable(R.drawable.two); 
        prev=2; 
       } 
       else if(prev==2){ 
        drawable = getResources().getDrawable(R.drawable.three); 
        prev=3; 
       } 
       else{ 
        drawable = getResources().getDrawable(R.drawable.one); 
        prev=1; 
       } 


       Bitmap wallpaper=((BitmapDrawable)drawable).getBitmap(); 

       try { 
        wpm.setBitmap(wallpaper); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } 
     }, interval); 

     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 
} 

Inoltre, è necessario utilizzare un AlarmManager o Handler per ottenere questo risultato? Sono abbastanza nuovo per Android e un po 'confuso.

risposta

7

Sembra che tu stia usando il timer sbagliato. Se vuoi che si ripresenti, devi specificare un ritardo iniziale come secondo argomento e un intervallo come terzo. Timer.schedule(timertask, initial delay, interval between recurrences);

Nota: sto parlando della tua chiamata a myTimer.schedule(object, interval);

+1

Impostare 0 per il ritardo per l'avvio immediato. :) – Calvin

+0

Grazie ... sembra che stia funzionando ora .. C'è un altro metodo myTimer.schedule() con solo due argomenti, quindi non mi ha dato un errore. Ad ogni modo, sono felice di non dover usare Handler ecc. – ambit

+0

Sì! L'utilizzo di soli due argomenti rende un timer one-shot. A volte utile! –

0

Prova invece di Timer classe ScheduledFuture
Ciò ha contribuito per me per risolvere tutti i problemi con i compiti di timer
Buona fortuna!

private ScheduledFuture mytimer; 

//... 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); 
    mytimer = timer.scheduleWithFixedDelay(new TimerTask() { 
     @Override 
     public void run() { 
      //... 
     } 
    }, 0, interval, TimeUnit.MILLISECONDS); 
    return super.onStartCommand(intent, flags, startId); 
} 

//... 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (mytimer != null) { 
     mytimer.cancel(true); 
    } 
    //... 
} 
Problemi correlati