我试图通过使用scheduleatfixedrate来创建一个可调整的时间序列。然而,当我编写这段代码时,我并不知道除非清除计时器,否则不能更改执行后的时间段。
这是我在一系列事件中的尝试:
@Override
protected void onStart()
{
super.onStart();
Timer timer = new Timer();
GregorianCalendar gCal = (GregorianCalendar) GregorianCalendar.getInstance();
final Runnable countDivision = new Runnable()
{
public void run()
{
/**
* Starts the sequence and wraps around when reached the last position
*/
if(playSequenceButton.isChecked())
{
setEnabled(true);
int length = sequencer.getLength();
int i = sequencer.getPosition();
DIODE[i].setChecked(true);
if(i > 0)
DIODE[i-1].setChecked(false);
if (i < 1)
DIODE[length].setChecked(false);
}
/**
* Stops and resets the sequence
*/
else
{
for (int i = 0; i < sequencer.getLength(); i++)
DIODE[i].setChecked(false);
sequencer.setPosition(START_POSITION);
setEnabled(false);
}
}
};
int millis = 999 - gCal.get(GregorianCalendar.MILLISECOND);
int inputBPM = TEMPO;
long qtrN=Math.round(((60000/inputBPM))*100000)/100000;
long sixteenN = (qtrN/4);
sixteenN=Math.round(sixteenN*100000)/100000;
timer.scheduleAtFixedRate(new TimerTask()
{
@Override
public void run()
{
// setEnabled(true);
runOnUiThread(countDivision);
}
}, 0, sixteenN);
}您建议使用什么方法来设置可以动态更改的周期时间?在runnable countDivision运行时,sixteenN变量需要能够更改。也许timertask不是合适的工具?
关于/M
发布于 2013-02-07 06:05:56
只需取消并重新安排TimerTask!
发布于 2013-02-07 06:47:27
我会避免使用TimerTask,而使用Handler。Handler对于跨线程通信、延迟和计时器非常有用,而且实际上使用起来非常简单。
以下示例显示如何使用处理程序创建定时事件循环:-
public class HandlerExampleActivity extends Activity {
private static final String TAG = HandlerExampleActivity.class.getSimpleName();
private static final int MSG_PING = 1;
private static final long MSG_DELAY = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ping();
}
void ping() {
Log.d(TAG, "Ping!");
mHandler.sendEmptyMessageDelayed(MSG_PING, MSG_DELAY);
}
void pong() {
Log.d(TAG, "Pong!");
ping();
}
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
if(msg.what == MSG_PING) {
pong();
}
};
};
}在Android中,如果你想要定时事件,处理器是正确的方式,有几个选项可以用来发送消息给处理器,你甚至可以使用Runnables:
mHandler.sendEmptyMessage(MSG_PING); // Send ping (almost) immediately
mHandler.sendEmptyMessageAtTime(MSG_PING,
SystemClock.uptimeMillis() + MSG_DELAY); // one second from now
mHandler.postAtTime(new Runnable() { // Even post runnables!
@Override
public void run() {
// TODO Something...
}
}, MSG_DELAY); 您可以将MSG_DELAY替换为一个可以动态更改以执行您想要的操作的间隔。
https://stackoverflow.com/questions/14442198
复制相似问题