我有一些AsyncTasks從網絡上下載數據。如果在某個時候我需要阻止他們,那麼最好的方法是什麼?
有關的文檔:取消HTTP下載器的最佳方法AsyncTask
task.cancel(mayInterruptIfRunning)
說:
試圖取消對此任務的執行。如果 任務已完成,已被取消或因其他原因不能取消 ,此嘗試將失敗。如果成功,並且此任務有 在調用取消時未啓動,則此任務不應運行。如果 任務已經啓動,則mayInterruptIfRunning參數 將確定執行此任務的線程是否應在嘗試停止任務時中斷 。
調用此方法將在doInBackground(Object [])返回後在UI線程上導致onCancelled(Object)被調用 。調用這個 方法可以保證不會調用onPostExecute(Object)。在 調用此方法之後,應該儘可能早地檢查由doInBackground(Object [])定期檢查由 isCancelled()返回的值以儘快完成 任務。
從中我明白,沒關係,如果mayInterruptIfRunning =真它試圖中斷線程,但在情況下,它不會成功一個必須檢查isCancelled()持續的背景流量。
這裏是HTTP案例。我在某處讀到Thread.interrupt實際上不會中斷IO操作,但是這是cancel()失敗的情況。
因此如何中止下載?
這裏的一些可能性心想:
- 隨着ApacheHttp *:覆蓋取消(boolean)方法,並在新的取消類似
httpUriRequestInstance.abort()
調用()。 HttpURLConnection:我可以得到inputStream並填充一個緩衝輸出流,以便定期檢查與isCancelled()相關的標誌。我的意思是這樣的:
... httpURLConnection code which creates an HttpURLConnection "conn" InputStream in = conn.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(defSize); byte[] buff = new byte[buffSize]; int br; while((br = in.read(buff)) >-1){ if(cancelled) return null; //eventually closing th inpustream baos.write(buffer,0,br); } // ...
你有什麼建議?
謝謝,while循環以某種方式減慢下載速度? – LJSilver 2014-12-19 16:23:58
緩衝區的大小越小,讀取所有內容所需的迭代次數就越多。可能會降低性能。但與服務器響應時間,網絡速度/等待時間(外部因素)相比,這種損失是微不足道的。然而,不必要的大緩衝區會佔用內存資源,可能需要系統在運行時釋放更多,從而降低整體性能 – 2014-12-19 16:39:50
好的,再次感謝我處理文件高達200-300Kb(圖像),現在我使用緩衝區4096b。是否有任何經驗法則來選擇緩衝區大小,或者我只能通過試驗去做? – LJSilver 2014-12-20 11:47:32