0

我创建了一个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();

        }
}

onPostExecutepaymentTask,我正在某些特定条件下进行一些操作。

基本上,我正在从某个网站检查,经过一段时间(比如 3 秒)后,任务是否已完成。

现在,如果互联网运行得很快,这段代码就没有问题,

如果任务完成,我取消 onPostExecute 中的计时器并做进一步的工作。

但是如果互联网运行缓慢,这意味着响应没有在 3 秒内出现, onPostExecute被多次调用(在其中多次执行代码),而任务已经完成,只是由于服务器我得到了迟到的响应问题/互联网延迟。

我如何确保里面的代码onPostExecute只被调用一次?

可能的方法:

  1. 取一些静态标志变量,使其为真并检查其他变量......

我正在寻找一些可靠的解决方案,也许android提供了一些机制来同步这个..谢谢

4

2 回答 2

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");
            } 
        }
      }
}

我希望这可以帮助你。

谢谢。

于 2013-04-18T08:52:47.337 回答
0

请根据http://daniel-codes.blogspot.in/检查它对您的帮助...

您的 AsyncTask 正在运行吗?

关于 AsyncTask 的简短说明:在 4.0 之前(也可能在 3.0 之前,但我没有测试过),AsyncTask.getStatus()可能会骗你。如果 AsyncTask 被取消,它不会正确设置状态;相反,它会在AsyncTask.onCancelled()完成后保持 RUNNING 很远。

我最初的想法是使用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;
  }
}
于 2013-04-18T06:03:09.203 回答