2014-12-19 57 views
2

我有一些AsyncTasks從網絡上下載數據。如果在某個時候我需要阻止他們,那麼最好的方法是什麼?
有關的文檔:取消HTTP下載器的最佳方法AsyncTask

task.cancel(mayInterruptIfRunning) 

說:

試圖取消對此任務的執行。如果 任務已完成,已被取消或因其他原因不能取消 ,此嘗試將失敗。如果成功,並且此任務有 在調用取消時未啓動,則此任務不應運行。如果 任務已經啓動,則mayInterruptIfRunning參數 將確定執行此任務的線程是否應在嘗試停止任務時中斷 。

調用此方法將在doInBackground(Object [])返回後在UI線程上導致onCancelled(Object)被調用 。調用這個 方法可以保證不會調用onPostExecute(Object)。在 調用此方法之後,應該儘可能早地檢查由doInBackground(Object [])定期檢查由 isCancelled()返回的值以儘快完成 任務。

從中我明白,沒關係,如果mayInterruptIfRunning =真它試圖中斷線程,但在情況下,它不會成功一個必須檢查isCancelled()持續的背景流量。
這裏是HTTP案例。我在某處讀到Thread.interrupt實際上不會中斷IO操作,但是這是cancel()失敗的情況。
因此如何中止下載?

這裏的一些可能性心想:

  1. 隨着ApacheHttp *:覆蓋取消(boolean)方法,並在新的取消類似httpUriRequestInstance.abort()調用()。
  2. 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); 
    } 
    // ... 
    

你有什麼建議?

回答

3

我一定會去HttpURLConnection。並可能會做這樣的事情:

  1. 添加公共無效取消()方法來我的自定義的AsyncTask 實施
  2. 實現cancel()作爲

    public void cancel() { this.cancel(true); mConnection.disconnect(); // TODO try close input stream }

  3. 從我的活動通話mMyAsyncTask.cancel()時要求

+0

謝謝,while循環以某種方式減慢下載速度? – LJSilver 2014-12-19 16:23:58

+0

緩衝區的大小越小,讀取所有內容所需的迭代次數就越多。可能會降低性能。但與服務器響應時間,網絡速度/等待時間(外部因素)相比,這種損失是微不足道的。然而,不必要的大緩衝區會佔用內存資源,可能需要系統在運行時釋放更多,從而降低整體性能 – 2014-12-19 16:39:50

+0

好的,再次感謝我處理文件高達200-300Kb(圖像),現在我使用緩衝區4096b。是否有任何經驗法則來選擇緩衝區大小,或者我只能通過試驗去做? – LJSilver 2014-12-20 11:47:32