簡體   English   中英

當在Android中調用AsyncTask.cancel(true)時,AsyncTask不會立即調用onCancelled

[英]AsyncTask won't call `onCancelled` immediately when AsyncTask.cancel(true) is called in android

我有一個AsyncTask ,它調用一個Web服務並從中獲取一個json對象。 我想為此任務設置一個超時時間,這樣,如果發生任何錯誤(例如互聯網連接斷開等),AsyncTask將被取消。 到目前為止,這是我的代碼:

@Override
protected void onStart() {
final GetRequestsTask requestTask = new GetRequestsTask();
requestTask.execute(createUrl());
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
      @Override
      public void run() {
          Log.d("myapp", "entered handler");
          if (requestTask.getStatus() == AsyncTask.Status.RUNNING) {
              Log.d("myapp", "entered cancelling");
              requestTask.cancel(true);
          }
      }
}, TIME_OUT);
}

問題在於,當handler到達“輸入的取消”點並將取消信號發送到AsyncTask ,它不會取消並立即調用onCancelled() (如果有10秒左右的時間,它將被調用)

GetRequestTask是線性的,這意味着它沒有一個循環中,所以我無法檢查isCancelled()手動內部doInBackground()方法。

你建議我做什么?

這個問題

如果您正在執行計算:

  • 您必須定期檢查isCancelled()。

如果您正在執行HTTP請求:

  • 將HttpGet或HttpPost的實例保存在某個地方(例如,公共字段)。
  • 調用cancel之后,請調用request.abort()。 這將導致IOException拋出在您的doInBackground內部。

另外,如果您使用某些庫來提供方便的請求,那么我認為它應該具有一些cance()方法。 例如,對於翻新,存在這種方法。

因此,在這種情況下,例如“如果您正在執行HTTP請求”部分。 你需要:

  • 保存您的請求實例(為進行改裝,請致電)
  • 調用cancel之后,為已保存的請求實例調用“ cancel”方法。

還有另一種選擇是rxJava。 借助該庫,您可以為您的請求創建Observable並保存對其預訂的引用。 然后,您只需要調用savedSubscription.unsibscribe()即可。

是的,Asynctask需要一些時間來調用onCancelled。 基本上,當doInBackground返回時,它將調用onCancelled()。 為了解決這個問題,您可以經常在doInBackground中檢查isCancelled(),並在它返回true時立即引發異常。 它將退出doInBackground並立即調用onCancelled()回調方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM