2012-03-16 6 views
5

Androidデバイスの壁紙を一定の間隔で、たとえば1時間ごとに変更するアプリを作成したいと考えています。現在私のコードでは、サービスを開始し、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

タイマーが間違っているようです。再帰させたい場合は、最初の遅延を2番目の引数として指定し、間隔を3番目の引数として指定する必要があります。 Timer.schedule(timertask, initial delay, interval between recurrences);

注:私はこれを試してみてください代わりにTimerクラスScheduledFuture
myTimer.schedule(object, interval);

+1

即時開始の遅延を0に設定します。 :) – Calvin

+0

ありがとうございました。これは現在動作しているようです.2つの引数だけを持つmyTimer.schedule()メソッドがいくつかあります。エラーが発生しませんでした。とにかく、私はハンドラなどを使う必要がないことを嬉しく思っています。 – ambit

+0

うん!引数を2つだけ使用すると、ワンショットタイマーが作成されます。時には便利です! –

0

にお電話について話している私は、タイマータスク
幸運とのすべての問題を解決するために役立ちました!

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