Android CountDownTimer和Runnable

时间:2014-05-30 15:15:52

标签: android multithreading runnable countdowntimer

我想做的事情: 我的应用程序连接蓝牙加速度计,每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);
            }

        }
    };

1 个答案:

答案 0 :(得分:0)

倒计时器在到期时不会重复,但您需要再次启动它。也许你可以在这种情况下使用AlarmManager来获得更好的设计。