在计时器上运行许多Asynctask(倒计时器)

时间:2013-04-18 05:51:48

标签: android android-asynctask countdowntimer

我已经创建了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内的代码只被调用一次?

可能的方法:

  1. 取一些静态标志变量,使其成立并检查其他变量......
  2. 我正在寻找一些可靠的解决方案,也许android提供了一些机制来同步这个..谢谢

2 个答案:

答案 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;
  }
}