在无限循环中调用延迟方法

时间:2014-01-13 13:39:31

标签: java android multithreading

如何在无限循环中调用方法,每隔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()的想法在这里是不可行的。或许它是?我怎样才能做到这一点?我无论如何都无法冻结任何活动......

2 个答案:

答案 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对象。