Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 即使在调用cancel之后,倒计时计时器的onTick方法也会不断被调用_Java_Android_Android Layout_Android Fragments_Android Intent - Fatal编程技术网

Java 即使在调用cancel之后,倒计时计时器的onTick方法也会不断被调用

Java 即使在调用cancel之后,倒计时计时器的onTick方法也会不断被调用,java,android,android-layout,android-fragments,android-intent,Java,Android,Android Layout,Android Fragments,Android Intent,我正在尝试加载一些数据。Id数据在我开始新活动之前的20秒内加载,否则我将通过给出一些相关消息来完成。我启动了一个倒计时装置来记录时间。加载数据后,我想停止计时器。我有以下课程: public class SplashActivity extends AppCompatActivity { private Context mContext; private Boolean mDataLoadedFromServer = false; private String mJS

我正在尝试加载一些数据。Id数据在我开始新活动之前的20秒内加载,否则我将通过给出一些相关消息来完成。我启动了一个倒计时装置来记录时间。加载数据后,我想停止计时器。我有以下课程:

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()之外调用
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();
        }
    }

基本上,当我从onTick()或onFinish()即从计时器内部取消计数器时,计数器不会简单地停止

然而,如果我从计时器之外的任何一点开始做,它会很容易停止

所以当我的数据被完全加载的时候…我调用了timer.cancle(),它成功了


但是,我仍然不明白,如果我们从计时器方法内部执行相同的操作,为什么它不起作用。

我尝试了这个代码片段,因为大多数答案都说不能在其实现内部取消计时器,因此我尝试在onFinish中使用一个处理程序。这是一篇老文章,但如果有人看到这篇文章,它会很有帮助

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

我从来没有写过这样的代码,但是。。。我认为您可以使用
onTick()
方法编写所有操作。假设所有数据总是在20秒内加载。因此,如果
Tick()
返回20秒,请永久运行一个新的
ABCActivity
。首先试试这个。如果它工作正常,我想您还有一个方法可以检查是否加载了数据。因此,在onTick()中的
if
语句中,编写一条语句,该语句不仅检查数据是否在20秒内加载,还检查数据是否在20秒内加载。否则(
else
statement)运行
XYZActivity
onTick()仍会被调用,因为您错过了删除回调。此外,我不知道
stopTimer()
到底在做什么。你把部分代码放在那里,所以看起来很不干净,以至于很多人不知道如何帮助你。如果你不想把整个代码。试试上面的方法。希望如此help@piotrek1543StopTimer在开始时提到它是:private void StopTimer(){mTimer.cancel();}它只是取消计时器。还有什么回调以及如何清除它们?另请发表评论。。我可以在OnTick()中检查相同的内容,但即使在启动XYZActivity之后,OnTick仍会不断被调用,我可以看到它的日志。如何阻止它?假设我的数据在2秒内被加载,因此我需要在那里停止。在其中一篇文章中,我读到,如果在方法外部调用倒计时,而不是在方法内部调用倒计时,倒计时效果很好完成计数器…当数据加载时…我需要尽快取消计时器…因此我检查每个onTick中加载的数据,如果加载了数据,则不等待完成并立即停止。它在
onTick()
中不起作用,您可以做的是尝试。