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();

        }
}

onPostExecuteof で、paymentTask特定の条件でいくつかの操作を行っています。

基本的に、私はいくつかのウェブサイトからチェックしています.一定の時間間隔(たとえば3秒)の後、タスクが完了したかどうかを確認しています.

インターネットが高速に動作する場合、このコードに問題はありません。

タスクが完了したら、onPostExecute のタイマーをキャンセルして、さらに作業を行います。

しかし、インターネットの速度が遅い場合、つまり応答が 3 秒以内に来ない場合 onPostExecuteは、複数回呼び出されます (内部でコードを複数回実行する) が、タスクは既に完了していますが、サーバーが原因で応答が遅れただけです。問題/インターネットの遅延。

onPostExecute内部のコードが一度だけ呼び出されるようにするにはどうすればよいですか?

可能なアプローチ:

  1. いくつかの静的フラグ変数を取得し、それを真にして、他の変数をチェックインします...

私は信頼できるいくつかの解決策を探しています.おそらくAndroidはこれを同期するためのメカニズムを提供しています..ありがとう

4

2 に答える 2

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 に答える