【问题标题】:onTick method of Countdown timer keeps getting called even after calling cancel即使在调用取消后,倒数计时器的 onTick 方法也会继续被调用
【发布时间】:2015-12-15 07:29:11
【问题描述】:

我正在尝试加载一些数据。 id 数据在 20 秒内加载,然后我开始新活动,否则我将通过提供一些相关消息来完成。我已经启动了一个 countdownTimer 来跟踪时间。加载数据后,我想停止计时器。我有以下课程:

public class SplashActivity extends AppCompatActivity {

    private Context mContext;
    private Boolean mDataLoadedFromServer = false;
    private String mJSONData;
    private SplashTimerForLoadingMasterDataForAllChannels mTimer;

    private void stopTimer(){
        mTimer.cancel();
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        setContentView(R.layout.activity_splash);
        mTimer = new SplashTimerForLoadingMasterDataForAllChannels(20000,1000);
        mTimer.start();
    }



        class SplashTimerForLoadingMasterDataForAllChannels extends CountDownTimer {

        public SplashTimerForLoadingMasterDataForAllChannels(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
            Log.d("testTimer", "SplashTimerForLoadingMasterDataForAllChannels");
            //SomE AsyncTAsk
            LoadData loaddata = new LoadData();
            loaddata.execute();
            //SomE AsyncTAsk
        }
        @Override
        public void onTick(long millisUntilFinished) {
            Log.d("testTimer", "onTick millisUntilFinished = " + millisUntilFinished + " mDataLoadedFromServer = " + mDataLoadedFromServer);
            //mDataLoadedFromServer is modified once Data is loaded in AsyncTask
            if(mDataLoadedFromServer) {
                stopTimer();
            }
        }

        @Override
        public void onFinish() {
            Log.d("testTimer", "onFinish");
            if(mDataLoadedFromServer) {
                mDataSavedAndNextActivityLaunched = true;
                if (Utils.checkIfUserLoggedIn()) {
                    mContext.startActivity(new Intent(mContext, ABCACtivity.class));
                } else {
                    mContext.startActivity(new Intent(mContext, XYZActivity.class));
                }
                finish();
            }
        }

    }



}

我在本地方法调用中取消了它,但 onTick 仍然被调用。有人可以帮忙吗?

【问题讨论】:

  • 我从来没有写过这样的代码,但是......我认为你可以用onTick()方法编写所有动作。假设所有数据总是在 20 秒内加载。因此,如果 Tick() 返回 20 秒,请永久运行新的 ABCActivity。先试试这个。
  • 如果它工作正常,我想你还有一个方法来检查是否加载了数据。因此,在 onTick() 中的 if 语句中编写一个语句,该语句不仅会检查数据是否在 20 秒内加载,而且还会检查当时是否真的加载了数据。否则(else 语句)运行 XYZActivity
  • 你的 onTick() 仍然被调用,因为你错过了删除回调。此外,我看不出stopTimer() 到底在做什么。你把你的代码部分放在那里,所以它看起来很不干净,很多人不知道如何帮助你。如果您不想放置整个代码。试试上面的方法。希望对您有所帮助
  • @piotrek1543 StopTimer 在开始时提到它是:private void stopTimer(){ mTimer.cancel();它只是取消计时器。还有什么回调以及如何清除它们?也对于第二条评论..我可以在 OnTick() 中检查相同的内容,但即使在 XYZActivity 启动后,onTick 也会不断被调用,我可以看到它的日志。如何阻止它?让我们说我的数据在 2 秒内加载,因此我需要停止比那里更晚。
  • StackOverflow 上存在一些问题,例如stackoverflow.com/questions/3138348/…。在其中一篇文章中,我读到 CountDownTimer 如果您在方法之外调用它,而不是在其中调用它,它的效果很好。

标签: java android android-layout android-fragments android-intent


【解决方案1】:

如果我从 onTick() 或从 onFinish() 即从 INSIDE TIMER 中取消它,基本上计数器不会简单地停止。

但是,如果我从计时器之外的任何时间点执行此操作,它很容易停止。

所以我的数据完全加载的时候......我调用了 timer.cancle() 并且它成功了。

但是我仍然不明白为什么如果我们在计时器方法内部做同样的事情它不起作用。

【讨论】:

    【解决方案2】:

    我尝试了这段代码 sn-p,因为大多数答案都说您无法在其实现中取消计时器,因此我尝试在 onFinish 中使用处理程序。旧帖子,但如果有人遇到它,它会很有帮助。

    new Handler().post(new Runnable() {
            @Override
            public void run() {
                timerTextView.setText("00:" + String.format("%02d", counter));
                cancel();
            }
        });
    

    【讨论】:

      【解决方案3】:

      您需要在CountDownTimeronTick() 之外致电stopTimer()

      类似的东西

      @Override
          public void onFinish() {
              Log.d("testTimer", "onFinish");
              if(mDataLoadedFromServer) {
                  mDataSavedAndNextActivityLaunched = true;
                  if (Utils.checkIfUserLoggedIn()) {
                      mContext.startActivity(new Intent(mContext, ABCACtivity.class));
                  } else {
                      mContext.startActivity(new Intent(mContext, XYZActivity.class));
                  }
                  finish();
                  stopTimer();
              }
          }
      

      【讨论】:

      • 但我不想调用 stopTimer() onFinish of counter....当数据加载时....我需要尽快取消计时器...所以我检查加载的数据每个 onTick 并且如果加载数据而不是等待完成并立即停止。
      • 它在onTick() 中不起作用,您还可以尝试Timer
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 2019-10-27
      • 1970-01-01
      相关资源
      最近更新 更多