检查计时器是否已重复运行的好方法



我正在研究React Native,我想创建一个永无止境的服务,在Native Modules上每(n)秒运行一次(关于这个主题是android)。

我创建了这样的简单服务

public void startTimer() {
    timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
      public void run() {
        Log.v(TAG, "SERVICE RUN");
        try{
          if(haveNetworkConnection()){
            db.openDB();
            if(db.countRowNewStructure()>0){
              //send data to server
            } else{
              Log.v(TAG, "No data should be send to server");
            }
          } else {
            Log.v(TAG, "Ga ada sinyal");
          }
        } catch (JSONException e){
          e.printStackTrace();
        }
      }
    }, 0, 1000);
  }

上面的代码每秒运行一次进行检查,但是当我从 React Native 重新运行服务时,我遇到了问题,日志每 0.5 秒向我显示一次这些代码

模拟可能是这样的:

0----------------1 //seconds
startTimer()
        re-run startTimer() conscious
        0----------------1 //seconds
        startTimer()
//now i have two startTimer() that will run every 1 sec on different interval

我想让我的 startTimer() 只运行一次,即使我每 0.5 秒触发一次startService()

我该怎么做?可能吗?

这可能会对您有所帮助。 在特定时间后在安卓中执行特定动作的计时器。

  final Handler handler = new Handler();
         Timer timer = new Timer();
         TimerTask timertaskforsynctime = new TimerTask() {
          @Override
          public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {
               // your action here    
                }
            });
        }
    };
    timer.schedule(timertaskforsynctime,5000,10000);// decide the time when it will start and after how much time it will run continusly.
}`

一次

new Handler().postDelayed(new Runnable(){
        @Override
        public void run() {
          // your code that will run after 1 sec
        }
    }, 1000);
您可以使用

cancel方法来取消之前的Timer

public class YourModule extends ReactContextBaseJavaModule {
   Timer tim = new Timer();
   public void startTimer() {
    tim.cancel();
    tim = new Timer();
    tim.scheduleAtFixedRate(
        new TimerTask() {
          public void run() {
            // Run tasks
          }
        },
        0,
        1000);
  }

}

最新更新