CountDownTimer未取消---取消后继续运行()

时间:2016-05-20 01:46:03

标签: android timer countdown countdowntimer

我在我的代码中实现了一个CountDownTimer,如下所示:在课程的顶部,我创建了

CountDownTimer myTimer;

然后当用户按下按钮Start时,将调用以下方法:

private void countme() 
{
    final int tick = 500;
    final int countTime = 10000;

    myTimer = new CountDownTimer(countTime, tick) {

        @Override
        public void onTick(final long millisUntilFinished) { }

        @Override
        public void onFinish() {
            myPicture.setVisibility(View.GONE);
        }
    };

    myTimer.start();
}

我有按钮全部停止myTimer.cancel()。如您所见,如果未取消计时器,myPicture将消失。

即使我单击停止按钮以便调用myTimer.cancel()(我使用日志语句对其进行了检查),计数器仍会继续倒计时并在完成后使图片消失。 / p>

为什么它不停止?如何让它实际取消?

为了澄清,我确实知道如何实现Runnable计时器,但它们不像CountDownTimers那样准确,这就是我在这种情况下不使用它们的原因。

4 个答案:

答案 0 :(得分:1)

经过大量尝试,窍门是在onCreate中声明计时器,但在其他方法中启动和取消计时器。取消计时器后,不会调用onFinish()。

    myTimer = new CountDownTimer(COUNT_DOWN_TIME, TICK) {
        @Override
        public void onTick(final long millisUntilFinished) {

            ((TextView) findViewById(R.id.textView3)).setText(""
                    + millisUntilFinished);
        }

        @Override
        public void onFinish() {
            findViewById(R.id.timer_imageBiew).setVisibility(View.GONE);
        }
    };



    private fun startTimer() {
           myTimer .start()
   }

   private fun stopTimer() {
           myTimer .cancel()
   }

答案 1 :(得分:0)

您的方法countme()中正在初始化myTimer,因此在此方法myTimer之外没有任何价值。

使用此

在顶部声明

CountDownTimer myTimer;
final int tick = 500;
final int countTime = 10000;

onCreateActivity

Fragment方法
 myTimer = new CountDownTimer(countTime, tick) {

        @Override
        public void onTick(final long millisUntilFinished) { }

        @Override
        public void onFinish() {
            myPicture.setVisibility(View.GONE);
        }
    };

现在使用myTimer.start()开始,myTimer.cancel()停止播放。

希望你理解。

答案 2 :(得分:0)

你的帖子很奇怪。我刚尝试做一个示例活动:

public class MainActivity extends AppCompatActivity {

    CountDownTimer myTimer;
    Button btnStart;
    Button btnCancel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample2);

        btnStart = (Button) findViewById(R.id.start);
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                countme();
                Toast.makeText(MainActivity.this, "Count Started!", Toast.LENGTH_SHORT).show();
            }
        });

        btnCancel = (Button) findViewById(R.id.cancel_timer);
        btnCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myTimer.cancel();
                Toast.makeText(MainActivity.this, "Clicked Stop Timer!", Toast.LENGTH_SHORT).show();
            }
        });

    }

    private void countme() {
        final int tick = 500;
        final int countTime = 10000;

        myTimer = new CountDownTimer(countTime, tick) {

            @Override
            public void onTick(final long millisUntilFinished) {
                Log.d(MainActivity.class.getSimpleName(), "onTick()");
            }

            @Override
            public void onFinish() {
                // myPicture.setVisibility(View.GONE);
                Toast.makeText(MainActivity.this, "In onFinish()", Toast.LENGTH_SHORT).show();
            }
        };

        myTimer.start();
    }

}

它完美无缺。它会停止计时器。但是我去看了看,发现这个answer,它提到CountDownTimer似乎没有用,所以他建议改用Timer。看看吧。干杯!

答案 3 :(得分:0)

这是一个有效的例子,我已经实现了处理程序和计时器,你可以选择一个。

import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class MainActivity extends Activity {

    private CountDownTimer myTimer;
    final int TICK = 500;
    final int COUNT_DOWN_TIME = 2000;

    // Option 2 using handler
    private Handler myhandler = new Handler();
    private Runnable runnable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Option 1 using timer
        myTimer = new CountDownTimer(COUNT_DOWN_TIME, TICK) {
            @Override
            public void onTick(final long millisUntilFinished) {

                ((TextView) findViewById(R.id.textView3)).setText(""
                        + millisUntilFinished);
            }

            @Override
            public void onFinish() {
                findViewById(R.id.timer_imageBiew).setVisibility(View.GONE);
            }
        };

        // Option 2 using handler
        runnable = new Runnable() {
            @Override
            public void run() {

                findViewById(R.id.handlerImageView).setVisibility(View.GONE);

            }
        };

        findViewById(R.id.start_timer).setOnClickListener(
                new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // Option 1 using timer
                        myTimer.start();

                        // Option 2 using handler
                        myhandler.postDelayed(runnable, COUNT_DOWN_TIME);

                    }
                });

        findViewById(R.id.stop_timer).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                // Option 1 stop timer
                myTimer.cancel();

                // Option 2 stop handler
                myhandler.removeCallbacks(runnable);
            }
        });
    }

}