簡體   English   中英

如何取消Android http請求?

[英]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]);

因為此同步函數調用封裝了請求的網絡方面。 如何在中途取消請求?

我正在考慮嘗試在請求期間更改超時時間,但這似乎線程不安全。

我也在考慮重寫AsyncTaskcancel()方法,這可能會更好。

有什么建議?

使用AndroidHttpClient API中止請求的正確方法是在傳遞給httpClient.execute()的請求對象上調用abort() httpClient.execute() 這將導致execute()調用拋出IOException ,並且請求的isAborted()調用開始返回true。 abort()調用在AbortableHttpRequest接口中定義,基本上所有有趣的請求類都實現( HttpGetHttpPost等)。

AsyncTask.cancel(true)不會取消請求,因為AndroidHttpClient.execute()不會以某種方式阻塞Thread.interrupt()會做什么停止(線程不等待加入另一個線程,等待互斥,或睡覺)。 Thread.interrupt()不會停止阻塞I / O.

在我的測試中,調用httpClient.close()httpClient.getConnectionManager().shutdown()不會阻止當前正在執行的請求,但我沒有深入研究以試圖找出原因。

httpclient.getConnectionManager().shutdown();

調用HttpPostHttpGetabort()方法。 您可以中止拋出(我忘記哪個特定)異常的請求。 如果您正在使用ClientConnectionManager ,則需要設置System.setProperty("http.keepAlive", "false") ,否則后續請求將掛起。 連接保持活動問題仍然存在至少4.1.1。

實際上,可以使用true作為終止線程的參數來調用AsyncTask.cancel(boolean interruptIfRunning)

暫無
暫無

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

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