[英]Execute method every second
我想在android中每秒執行一些代碼,但是我想在一個線程(主線程)中執行。 到目前為止,我有這個:
locationTimer = new Timer("locationTimer", false);
locationTimer.schedule(new LocationCheckerTask(this), 0, 1000);
public class LocationCheckerTask extends TimerTask {
private GeoWatcher watcher;
public LocationCheckerTask(Context context) {
watcher = new GeoWatcher(context);
}
@Override
public void run() {
// funky stuff
}
}
不幸的是, Timer
類在另一個線程上運行它的任務。 為什么我要在單個線程中執行此操作? run()
方法中的代碼將非常快地執行,因此我認為不需要其他線程。 我想做的是基於每秒計算的條件在run()
方法中構造單獨的線程。 因此,與其讓子線程構造另一個線程,不如在主線程上執行此操作。
您可以使用處理程序執行此操作
public class Job implements Runnable{
private Handler handler;
public Job () {
handler = new Handler(Looper.getMainLooper());
loop();
}
@Override
public void run() {
// funky stuff
loop();
}
private void loop() {
handler.postDelayed(this, 1000);
}
}
使用runOnUiThread(Runnable)
方法在UI線程中運行任務
public class LocationCheckerTask extends TimerTask {
private GeoWatcher watcher;
public LocationCheckerTask(Context context) {
watcher = new GeoWatcher(context);
}
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
// funky stuff
}
});
}
}
處理程序是此類任務的理想選擇(不要嘗試將TimerTask + runOnUiThread組合在一起-它無用,因為它在后台使用了處理程序)
private Runnable fiveSecondRunnable = new Runnable() {
@Override
public void run() {
if (count5 < 0) {
switchT030Sec();
} else {
tvSec5.setText(""+count5);
Log.v("5sec set", "yes");
count5--;
man.postDelayed(this, 1000);
}
}
};
並通過調用開始
man.post(fiveSecondRunnable);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.