2012-03-16 2 views
5

Я хочу создать приложение, которое будет менять обои Android-устройства через определенные промежутки времени, скажем, каждый час или около того. В настоящее время в моем коде я запускаю службу и использую объект Timer. Объект Timer будет вызываться через регулярные промежутки времени и менять обои.Android-приложение для изменения обоев с регулярными интервалами с использованием таймера

Это код, который я использую в настоящее время. Обои меняют только один раз, а не после этого. Пожалуйста, дайте мне знать, что мне делать?

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; 
    } 
} 

Кроме того, нужно ли использовать AlarmManager или Handler для достижения этого? Я совершенно новый для Android и немного смущен.

ответ

7

Похоже, что вы используете таймер неправильно. Если вы хотите, чтобы он повторялся, вам нужно указать начальную задержку как второй аргумент, а интервал - как третий. Timer.schedule(timertask, initial delay, interval between recurrences);

Примечание: Я говорю о вашем вызове myTimer.schedule(object, interval);

+1

Установить 0 для задержки для немедленного запуска. :) – Calvin

+0

Спасибо .. кажется, сейчас работает. Существует еще один метод myTimer.schedule() с двумя аргументами, так что это не дало мне ошибку. Во всяком случае, я рад, что мне не нужно использовать Handler и т. Д. – ambit

+0

Yup! Использование только двух аргументов делает одноразовый таймер. Иногда полезно! –

0

Попробуйте вместо Timer класса ScheduledFuture
Это помогло мне решить все проблемы, связанные с задачами таймера
Удачи!

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); 
    } 
    //... 
}