Java 即使在调用cancel之后,倒计时计时器的onTick方法也会不断被调用
我正在尝试加载一些数据。Id数据在我开始新活动之前的20秒内加载,否则我将通过给出一些相关消息来完成。我启动了一个倒计时装置来记录时间。加载数据后,我想停止计时器。我有以下课程: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
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()
中不起作用,您可以做的是尝试。