我想做的事情: 我的应用程序连接蓝牙加速度计,每50ms获取一次加速度数据。我想用Runnable检查这些。这很好用。但是,对于完整的应用程序,我添加了两个CountDownTimers:
1)introTimer(),它在AlertDialog中运行并从3开始倒计时.OnFinish()调用(i)我的Runnable,它处理新的加速度数据和(ii)第二个定时器
2)mainTimer(),从20开始倒计时,刷新UI上的TextView。
我的问题是,我的Runnable只在首次调用时执行一次。这是为什么?显然我还没有理解这背后的线程原理。我的下一步(可能会很复杂)是在UI上每隔50ms(或者可能更少,但仍然具有相对较高的频率)刷新ImageViews,具体取决于加速度计数据。
我考虑过删除Runnable并将我的计算放在CountDownTimer中,但这对于时序/频率/周期来说可能很困难或不准确。你觉得怎么样?
以下是代码部分。如果你认为其他部分是相关的,我也可以发布它们:
startButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
LayoutInflater layoutInflater = getActivity().getLayoutInflater();
View promptView = layoutInflater.inflate(R.layout.intro_timer_prompt, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final TextView introTimer = (TextView) promptView.findViewById(R.id.introTimer);
builder.setView(promptView);
AlertDialog alertD = builder.create();
alertD.show();
introTimer(introTimer, alertD);
}
private void introTimer(final TextView introTimer, final AlertDialog alertD) {
new CountDownTimer(4*1000, 1000) {
public void onTick(long millisUntilFinished) {
introTimer.setText( ""+ (millisUntilFinished / 1000));
}
public void onFinish() {
alertD.cancel();
// mainTimer();
clearArrayLists();
mHandler = new Handler();
mHandlerTask.run();
mainTimer();
}
}.start();
}
private void mainTimer() {
new CountDownTimer((int)DURATION*1000, 10) {
public void onTick(long millisUntilFinished) {
//mTimerView.setText("seconds remaining: " + millisUntilFinished / 1000 + ":" + millisUntilFinished / 1000. );
long millisecs = Math.round(millisUntilFinished % 1000 / 100);
mTimerView.setText("seconds remaining: " + millisUntilFinished / 1000 + ":" + millisecs );
}
public void onFinish() {
String energy = new DecimalFormat("#.##").format(accumulatedKineticEnergy.get(accumulatedKineticEnergy.size()-1));
mTimerView.setText("Accumulated Energy is " + energy + " Joule.");
}
}.start();
}
Runnable mHandlerTask = new Runnable() {
@Override
public void run() {
Log.i(TAG, "executed only once :( ");
if (a_x.size() < DURATION/INTERVAL) {
try {
calcAccList();
//...calc things...;
mHandler.postDelayed(this, (long) (1000*INTERVAL));
} catch (Exception e) {
e.getMessage();
}
}
else {
mHandler.removeCallbacks(mHandlerTask);
}
}
};
答案 0 :(得分:0)
倒计时器在到期时不会重复,但您需要再次启动它。也许你可以在这种情况下使用AlarmManager来获得更好的设计。