34

定期的にコードを実行する必要があります(サーバーに接続し、MySQLデータベースから毎分データをプルします)。この目的のために、私はSyncクラスを持っています:

public class Sync {

    static private Handler handler = new Handler();
    Runnable task;

    public Sync(Runnable task, long time) {
        this.task = task;
        handler.removeCallbacks(task);
        handler.postDelayed(task, time);
    }
}

そして私の活動では私は持っています:

public void onCreate(Bundle savedInstanceState) {
    ...
    Sync sync = new Sync(call,60*1000);
    ...
}

final private Runnable call = new Runnable() {
    public void run() {
    //This is where my sync code will be, but for testing purposes I only have a Log statement
    Log.v("test","this will run every minute");
    }
};

テスト期間を短くしてこれを試しましたが、実行は1回だけです。初めてメッセージをログに記録するとき、それは最後でもあります。誰かが私がここで間違っていることを見ますか?ありがとう!

4

5 に答える 5

57

以下のコードを使用してそれを行うことができます、それが役立つことを願っています!

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 

    @Override 
    public void run() { 
        try{
            //do your code here
        }
        catch (Exception e) {
            // TODO: handle exception
        }
        finally{
            //also call the same runnable to call it at regular interval
            handler.postDelayed(this, 1000); 
        }
    } 
}; 

//runnable must be execute once
handler.post(runnable);
于 2012-04-18T10:44:33.833 に答える
8

まず、ハンドラーをグローバルに宣言する必要があります。次に、runnableでpost Delayメソッドを再度使用して、ハンドラーを再度トリガーする必要があります。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Sync sync = new Sync(call,60*1000);

    }
    final private Runnable call = new Runnable() {
        public void run() {
        //This is where my sync code will be, but for testing purposes I only have a Log statement
        Log.v("test","this will run every minute");
        handler.postDelayed(call,60*1000);
        }
    };
    public final Handler handler = new Handler();
    public class Sync {


        Runnable task;

        public Sync(Runnable task, long time) {
            this.task = task;
            handler.removeCallbacks(task);
            handler.postDelayed(task, time);
        }
    }


}
于 2012-04-18T10:53:23.330 に答える
3

handler.postDelayed(task, time);は1回だけ実行されます。コードを定期的にトリガーする場合は、aTimerとaのTimerTask代わりにaHandlerとをお勧めしRunnableます。

TimerTasksx秒ごとに1回実行するように設定することも、x秒などの固定期間で実行するように設定することもできます。

于 2012-04-18T10:45:45.697 に答える
1
      private void doSomethingRepeatedly() {
      timer.scheduleAtFixedRate( new TimerTask() {
            public void run() {

                  try{

                   //Your code

                  }
                  catch (Exception e) {
                      // TODO: handle exception
                  }

             }
            }, 0, 10000);
                     }
于 2014-02-26T13:31:44.090 に答える
1

別の方法として、ScheduledExecutorServiceのscheduleAtFixedRateを使用します。

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

public void beepEvery10Seconds() {
     final Runnable beeper = new Runnable() {
       public void run() { System.out.println("beep"); }
     };
     final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 0, 10, SECONDS);
}
于 2017-09-06T15:42:04.870 に答える