我已经创建了CountDownTimer
这样的
public class MyCountDownTimer extends CountDownTimer {
public MyCountDownTimer(long startTime, long interval) {
super(startTime, interval);
}
@Override
public void onFinish() {
//timeout
}
@Override
public void onTick(long millisUntilFinished) {
PaymentAsyncTask paymentTask = new PaymentAsyncTask(this);
paymentTask.execute();
}
}
在onPostExecute
的{{1}}中,我正在某些特定情况下进行一些操作。
基本上,我在某个网站上检查,经过一段时间间隔(比如3秒)后,任务已经完成。
现在,如果互联网运行速度很快,此代码就没有问题,
如果任务完成,我取消onPostExecute中的计时器并继续我的工作。
但是如果互联网运行慢,这意味着响应不会在3秒内发生,
paymentTask
不止一次被调用(不止一次在其中执行代码),而任务已经完成,只是因为服务器问题/互联网延迟我得到的回复很晚。
我怎样才能确保onPostExecute
内的代码只被调用一次?
可能的方法:
我正在寻找一些可靠的解决方案,也许android提供了一些机制来同步这个..谢谢
答案 0 :(得分:1)
您实际上可以检查AsyncTask
的状态,并根据您可以执行逻辑的当前状态。
请在AsyncTask
课程中全身考虑Activity
个对象。
代码段:
public class MyCountDownTimer extends CountDownTimer {
PaymentAsyncTask paymentTask = null;
public MyCountDownTimer(long startTime, long interval) {
super(startTime, interval);
}
@Override
public void onFinish() {
//timeout
}
@Override
public void onTick(long millisUntilFinished) {
if(paymentTask == null) {
android.util.Log.i("TAG", "Null");
paymentTask = new PaymentAsyncTask(this);
paymentTask.execute();
} else {
//Depending on your situation take appropriate action
android.util.Log.i("TAG", "Not Null");
if(paymentTask.getStatus() == (AsyncTask.Status.PENDING)) {
//Indicates that the task has not been executed yet.
android.util.Log.i("TAG", "Pending");
} else if(paymentTask.getStatus() == (AsyncTask.Status.RUNNING)) {
//Indicates that the task is running.
android.util.Log.i("TAG", "Running");
} else if(paymentTask.getStatus() == (AsyncTask.Status.FINISHED)) {
//Indicates that AsyncTask.onPostExecute has finished.
android.util.Log.i("TAG", "Finished");
}
}
}
}
我希望这可以帮到你。
感谢。
答案 1 :(得分:0)
请根据http://daniel-codes.blogspot.in/ ...
查看它对您有所帮助您的AsyncTask是否正在运行?
关于AsyncTask的简短说明:在4.0之前(可能在3.0之前,但我还没有测试过), AsyncTask.getStatus()可能对你不利。如果取消AsyncTask,则不会正确设置状态;相反,它会在 AsyncTask.onCancelled()完成后保持运行。
我最初的想法是使用 AsyncTask.isCancelled(),但是如果您正在尝试衡量是否从另一个线程完成了AsyncTask,那么您可能遇到一些并发问题。取消AsyncTask并不一定会在取消它时结束;事实上,如果你没有在 doInBackground()中定期检查 isCancelled(),那么你可以在取消后最终让AsyncTask运行一段时间。
我的解决方案是在 onCancelled()的末尾设置一个布尔值,它将向系统表明你已经执行完毕。下面是编写AsyncTask的示例,您可以在其中正确地知道它何时完成:
private class MyAsyncTask extends AsyncTask {
private boolean mFinishedCancel = false;
protected Void doInBackground(Void... params) {
return null; // You'd normally do something here
}
protected void onCancelled() {
mFinishedCancel = true;
}
public boolean isFinished() {
return getStatus() == Status.FINISHED || mFinishedCancel;
}
}