[英]AsyncTask onCancelled(Object) never invoked after asyncTask.cancel(true);
[英]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()
方法。
你建議我做什么?
從這個問題 :
如果您正在執行計算:
如果您正在執行HTTP請求:
另外,如果您使用某些庫來提供方便的請求,那么我認為它應該具有一些cance()方法。 例如,對於翻新,存在這種方法。
因此,在這種情況下,例如“如果您正在執行HTTP請求”部分。 你需要:
還有另一種選擇是rxJava。 借助該庫,您可以為您的請求創建Observable並保存對其預訂的引用。 然后,您只需要調用savedSubscription.unsibscribe()即可。
是的,Asynctask需要一些時間來調用onCancelled。 基本上,當doInBackground返回時,它將調用onCancelled()。 為了解決這個問題,您可以經常在doInBackground中檢查isCancelled(),並在它返回true時立即引發異常。 它將退出doInBackground並立即調用onCancelled()回調方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.