2011-09-15 2 views
3

Android用サービスを開発しています。バックグラウンドで実行し、100秒ごとに関数を実行する必要があります。それはソースコードです(例)Androidで新しいクラスのないシンプルなタイマーを作るには?

package com.example 

import .... 

public class Servizio extends Service { 

    public IBinder onBind(Intent intent) { 

    } 

    public void onCreate() { 

    } 

    public void onDestroy() { 

    //here put the code that stop the timer cycle 

    } 

    public void onStart(Intent intent, int startid) { 

    //i want to begin here the timercycle that each 100 s call myCycle() 

    } 

    public void myCycle() { 

    //code that i can't move on other class!!! 

    } 

} 

どうすればいいですか?今サービスはmyCycle()を1回だけ実行します。なぜなら、私はonStart()を呼び出しているからです。

答えて

7

Timerには、TimerTaskを使用してください。 100秒ごとにメソッドを実行するには、onStartメソッドで次のメソッドを使用できます。このメソッドは新しいスレッドを作成することに注意してください。 Updating the UI from a Timer:この記事に記載されているようにあるいは

new Timer().schedule(new TimerTask() { 
    @Override 
    public void run() { 
     myCycle(); 
    } 
}, 0, 100000); 

は、android.os.Handlerを使用します。メインスレッドで実行されるため、第2のスレッドのオーバーヘッドを避けるため、Timerより優れています。

private Handler handler = new Handler(); 
Runnable task = new Runnable() { 
    @Override 
    public void run() { 
     myCycle(); 
     handler.postDelayed(this, 100000); 
    } 
}; 
handler.removeCallbacks(task); 
handler.post(task); 
+0

私の答えを密かにして、私にタイプミスを修正する時間を与えないようなものは何もありません。 – JPM

+0

私はあなたの答えを「密かに」しませんでした。私はすでに私のことを書いていた。とにかくあなたのことは間違っていた。 – dogbane

+0

あなたが私に見える場合は – JPM

1

通常、私が正しく理解していれば、myCycleを100秒ごとに実行したいと思っています。

Timer myTimer = new Timer(); 
myTimer.schedule(new TimerTask() { 
    @Override 
    public void run() { 
     myCycle(); 
    } 
}, 0,100000); 
1

私はこれが私の解決策だった私は定期的にWebサービスを呼び出すこの問題、持っていたとき:

public class MyService extends Service { 
    private Handler mHandler = new Handler(); 
    public static final int ONE_MINUTE = 60000; 
    private Runnable periodicTask = new Runnable() { 
     public void run() { 
      mHandler.postDelayed(periodicTask, 100 * ONE_MINUTE); 
      token = retrieveToken(); 
      callWebService(token); 
     } 
    }; 

をWebサービスからの遅延はdoesnのを呼び出すように私は早くpostDelayedを呼び出しますタイミングがずれることはありません。

2つの関数は、実際にはMyServiceクラスにあります。

UPDATE:

ここに示されているようにあなたがpostDelayedへのRunnableを渡すことができ:

http://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable, long)

公共最終ブールpostDelayed(RunnableをR、長いdelayMillis)

以来:APIレベル1 Runnable rをメッセージ キューに追加します。指定された時間が経過すると実行されます。 実行可能ファイルは、このハンドラが接続されているスレッド上で実行されます。

また、機能が不足しているため、私のコードはコンパイルされません。これは、OPが実行できるものの例として示されています。

+0

私はこの回答が最高です – JPM

+0

これはコンパイルされません。 'periodicDask'ではなく' postDelayed'に 'this'を渡す必要があります。 – dogbane

+0

@dogbane - 私は持っていたものをデモンストレーションとして取り出し、コンパイルしました。私はいくつかの行を取り出したが、私のperiodicTaskは、私が現在使っているものからほとんど変わっていない。 –

関連する問題