如何在无限循环中调用方法,每隔200ms调用一次?我的意思是:sendMessage()
- >等待(200ms) - > sendMessage
- >等待(200ms)等等,除非用户通过按下按钮决定不这样做。以sendMessage
方法为例:
private void sendMessage(String message) {
if (mCommandService.getState() != CommandService.STATE_CONNECTED) {
Toast.makeText(this, R.string.title_not_connected, Toast.LENGTH_SHORT).show();
return;
}
if (message.length() > 0) {
byte[] send = message.getBytes();
mCommandService.write(send);
mOutStringBuffer.setLength(0);
mOutEditText.setText(mOutStringBuffer);
}
}
我无法使用Thread.sleep()
,因为它会冻结用户界面。我想,handler.postDelayed()
的想法在这里是不可行的。或许它是?我怎样才能做到这一点?我无论如何都无法冻结任何活动......
答案 0 :(得分:4)
您尝试实现的目标显然是异步任务。处理程序或计时器应该是您的选择。使用postDelayed,您需要在任务完成后每次调用该方法,因此您的计时器的scheduleAtFixedRate应该是您的选择。
编辑:
Timer timer;
TimerTask task;
和onCreate
timer = new Timer();
task = new Sender();
public startTimer() {
if(task != null) {
timer.scheduleAtFixedRate(task, 200);
}
}
public stopTimer() {
timer.cancel();
}
private class Sender extends TimerTask {
@Override
public void run() {
// TODO Auto-generated method stub
if (mCommandService.getState() != CommandService.STATE_CONNECTED) {
Toast.makeText(this, R.string.title_not_connected, Toast.LENGTH_SHORT).show();
return;
}
if (message.length() > 0) {
byte[] send = message.getBytes();
mCommandService.write(send);
mOutStringBuffer.setLength(0);
mOutEditText.setText(mOutStringBuffer);
}
}
}
答案 1 :(得分:2)
使用另一个线程来运行循环。它不应该在Event Dispatch Thread中运行,你可以使用SwingWorker对象。