线程安全-如何在Android中每20秒调用一次方法



我想写一个Android应用程序,当它打开时,在20秒后调用一个方法,然后每10秒自动调用一次方法。

有什么想法吗?

您可以用一个Handler来完成,如下所示:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
   @Override
   public void run() {
       //Do something after 20 seconds
   }
}, 20000);  //the time is in miliseconds

为了每10秒重复一次,你可以用相同的方法添加以下行

handler.postDelayed(this, 10000);

像这样:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
   @Override
   public void run() {
       //Do something after 20 seconds
       handler.postDelayed(this, 10000);
   }
}, 20000);  //the time is in miliseconds

您可以使用Timer,对于该实现,您可以像一样完成

new java.util.Timer().schedule( 
    new java.util.TimerTask() {
        @Override
        public void run() {
            // your code here
        }
    }, 
    5000 
);

请检查以下代码。

new Timer().scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
 // Enter your code
}
            }, 0, 20000);//put here time 1000 milliseconds=1 second

希望这个代码能帮助你。

CountDownTimer cdt;
cdt = new CountDownTimer(timeint * 60 * 1000, 1000) {
    @Override
    public void onTick(long millisUntilFinished) {          
        Log.i(TAG, millisUntilFinished " millis left");
    }
    @Override
    public void onFinish() {
        Log.i(TAG, "Timer finished");
    }
};
cdt.start();

如果您想在应用程序处于非活动状态的情况下进行工作,可以使用报警管理器(关闭)

它一直在运行,直到你不停下来。

这是完整的示例

url

http://javatechig.com/android/repeat-alarm-example-in-android

声明处理程序对象:

Handler myHandler = new Handler();
myHandler.postDelayed(new Runnable() {
   @Override
   public void run() {
       //Do something after 20 seconds
    //call the method which is schedule to call after 20 sec
   }
}, 200000);  //the time is in miliseconds

-再次10秒执行与上述相同的操作,并使循环重复

希望这会有所帮助。。。感谢

您需要每20秒调用一次Handler,并在每次传递过程中更新UI。

代码应该是这样的:

final Handler handler = new Handler();//class variable
int count = 0;
handler.post(new Runnable() {
  @Override
  public void run() {
    updateCounter(count++);
    if(count < (10*20000)) { 
        handler.postDelayed(this, 20000);
    }
  }
});

以及更新计数器的功能:

private void updateCounter(final int count) {
  runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // you have the seconds passed
        // do what ever you want
    }
  });
}

您需要使用自定义处理程序来完成这项工作。以下是您需要的示例:

public class Main extends Activity  { 
  private TextView txtStatus;
  private RefreshHandler mRedrawHandler = new RefreshHandler();
  class RefreshHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
      Main.this.updateUI();
    }
    public void sleep(long delayMillis) {
      this.removeMessages(0);
      sendMessageDelayed(obtainMessage(0), delayMillis);
    }
  };
  private void updateUI(){
    int currentInt = Integer.parseInt((String) txtStatus.getText()) + 10;
    if(currentInt <= 100){
      mRedrawHandler.sleep(10000);
      txtStatus.setText(String.valueOf(currentInt));
    }
  }
  @Override 
  public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main);
    this.txtStatus = (TextView) this.findViewById(R.id.txtStatus);
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
    @Override
      public void run() {
          updateUI();
        }
    }, 20000);  
  } 
}

使用计时器类

private  CountDownTimer countDownTimer;
private void startTimer(final Context context) {
    if (countDownTimer != null) {
        countDownTimer.cancel();
        countDownTimer = null;
    }
    countDownTimer = new CountDownTimer(20 * 1000, 1 * 1000) {
        public void onTick(long millisUntilFinished) {
            //
        }
        public void onFinish() {

           yourMethod();

                startTimer(context);
            }
        }
    }.start();
}

最新更新