我正在尝试将 PC Java 程序移植到 Android 平台。PC 应用程序使用 Swing.Timer 每秒触发一次更新。关联的侦听器在被调用时从数据库中获取新数据,然后使用 Graphics2D 更新/重绘屏幕。我已经学会了如何使用 Android 的 Canvas 来绘制与我使用 PC 应用程序相同的东西。现在我正在尝试学习如何在 Android 中使用等效的 Timer。不幸的是,在 Android 平台上,事情似乎并不那么简单。有 Timers、Handlers、AlarmManagers 和 AsyncTasks。似乎 AsyncTasks 和 AlarmManagers 更适合一次性(重型?)任务(对吗?错了?)关于 Timers 和 Handlers,我看到很多帖子说不要使用 Timer,而是使用 Handlers。我在网上某处找到了下面代码中使用的方法并尝试了它。似乎它应该做我想做的事,但是每当我单击停止按钮时它都会挂起 GUI。有谁知道它为什么这样做?
感谢一百万比尔
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dateFormat = new SimpleDateFormat(dateFormatString);
mHandler = new Handler();
mUpdateTimeTask = new MyRunnable();
Button button = (Button) findViewById(R.id.start_button);
button.setOnClickListener(new MyStartListener());
button = (Button) findViewById(R.id.stop_button);
button.setOnClickListener(new MyStopListener());
}
class MyStartListener implements View.OnClickListener {
public void onClick(View v) {
if (startUptimeMillis == 0L) {
startUptimeMillis = SystemClock.uptimeMillis();
mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.postDelayed(mUpdateTimeTask, 100);
}
}
};
class MyStopListener implements View.OnClickListener {
public void onClick(View v) {
mHandler.removeCallbacks(mUpdateTimeTask);
}
};
class MyRunnable implements Runnable {
public void run() {
final long start = startUptimeMillis;
long millis = SystemClock.uptimeMillis() - start;
int seconds = (int) (millis / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
TextView tv = (TextView) findViewById(R.id.time_textView);
tv.setText(dateFormat.format(calendar.getTime()));
mHandler.postAtTime(this, (((minutes * 60) + seconds + 1) * 1000));
}
};
编辑:问题是 postAtTime 需要一个绝对的开始时间,而不是我的示例使用的延迟。(请参阅此处的 postAtTime)所以我用下面的代码替换了上面的所有时间代码,它做了我想要的!!:
long millis = SystemClock.uptimeMillis();
mHandler.postAtTime(this, millis+1000);