Android多線程下載檔案,android多線程

來源:互聯網
上載者:User

Android多線程下載檔案,android多線程

Android 實現多線程下載:

首先看下:

UI介面



多線程下載的時候log列印介面




開始工作,首先我們通過HttpURLConnection類串連需要下載的檔案:

new Thread(new Runnable() {@Overridepublic void run() {try {url = new URL(DOWNURL);HttpURLConnection conn = (HttpURLConnection) url.openConnection();// conn.connect();totalLength = conn.getContentLength();System.out.println(totalLength);singleLength = (totalLength + THREADNUM - 1) / THREADNUM;startDown();} catch (Exception e) {e.printStackTrace();}}}).start();

其中根據conn.getContentLength()Function Compute需要下載檔案的總位元組長度

得到總長度後通過singleLength = (totalLength + THREADNUM - 1) / THREADNUM;計算出每個線程所負責的模組單位長度,在這裡大家想一下為什麼用這個公式而不是直接

singleLength = totalLength / THREADNUM;計算呢?


計算出單個線程負責模組長度後就方便了,我們直接通過迴圈調用多個線程,每個線程負責自己的下載模組,再此之前我們需要計算出每個木塊下載的開始和結束位置

private void startDown() {for (int i = 0; i < THREADNUM; i++) {File cacheFile = new File(cacheDir, "temp" + i);long begin = i * singleLength + cacheFile.length();long end = begin + singleLength - 1;System.out.println("第" + i + "個快取檔案:" + begin + "-" + end);new downThread(begin, end, cacheFile).start();}}
然後開啟多線程下載任務

class downThread extends Thread{private long begin;private long end;private File cacheFile;public downThread(long begin, long end, File cacheFile) {super();this.begin = begin;this.end = end;this.cacheFile = cacheFile;}@Overridepublic void run() {try {HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestProperty("Range", "bytes=" + begin + "-"+ end);FileOutputStream out = new FileOutputStream(cacheFile);InputStream in = conn.getInputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = in.read(buffer)) != -1)out.write(buffer, 0, len);in.close();out.close();System.out.println(cacheFile.toString()+"快取檔案下載完成");megageFile();} catch (IOException e) {e.printStackTrace();}}}

這裡核心代碼既是通過conn.setRequestProperty("Range", "bytes=" + begin + "-"+ end);這個語句控制每次請求伺服器所下載的檔案位置,其他地方和普通請求完全一致;



每個線程完成後,我們需要合并每個線程的快取檔案,合并快取檔案的時候要判斷每個線程負責的模組都下載完畢並保證是順序合并,

這裡怎麼實現,即 megageFile();  這個函數的核心代碼是什麼呢?


我剛開始的時候下載檔案內容1234567890 合并後就變成了 5678123490 ;     這裡就不貼代碼了留給大家思索


源碼下載(附cache檔案合并方法):點擊開啟連結








相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.