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檔案合并方法):點擊開啟連結