[英]How do I cancel an Android http request?
我正在使用AsyncTask
AndroidHttpClient
並在doInBackground()
執行POST請求。 我希望用戶能夠通過按后退按鈕取消請求。 AsyncTask
具有cancel()
方法,該方法僅改變的布爾值返回isCancelled()
然后等待doInBackground()
調用之前完成onCancelled()
這意味着AsyncTask
將其doInBackground()
方法來連續檢查任務是否已被取消(使用isCancelled()
)。 如果它已被取消, doInBackground()
應該過早地提前返回。 我遇到的問題是99%的doInBackground()
中的工作線程的執行停止:
HttpResponse response = httpClient.execute(request[0]);
因為此同步函數調用封裝了請求的網絡方面。 如何在中途取消請求?
我正在考慮嘗試在請求期間更改超時時間,但這似乎線程不安全。
我也在考慮重寫AsyncTask
的cancel()
方法,這可能會更好。
有什么建議?
使用AndroidHttpClient API中止請求的正確方法是在傳遞給httpClient.execute()
的請求對象上調用abort()
httpClient.execute()
。 這將導致execute()
調用拋出IOException
,並且請求的isAborted()
調用開始返回true。 abort()
調用在AbortableHttpRequest
接口中定義,基本上所有有趣的請求類都實現( HttpGet
, HttpPost
等)。
AsyncTask.cancel(true)
不會取消請求,因為AndroidHttpClient.execute()
不會以某種方式阻塞Thread.interrupt()
會做什么停止(線程不等待加入另一個線程,等待互斥,或睡覺)。 Thread.interrupt()
不會停止阻塞I / O.
在我的測試中,調用httpClient.close()
或httpClient.getConnectionManager().shutdown()
不會阻止當前正在執行的請求,但我沒有深入研究以試圖找出原因。
httpclient.getConnectionManager().shutdown();
調用HttpPost
或HttpGet
的abort()
方法。 您可以中止拋出(我忘記哪個特定)異常的請求。 如果您正在使用ClientConnectionManager
,則需要設置System.setProperty("http.keepAlive", "false")
,否則后續請求將掛起。 連接保持活動問題仍然存在至少4.1.1。
實際上,可以使用true
作為終止線程的參數來調用AsyncTask.cancel(boolean interruptIfRunning)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.