android多線程下載

 android實現多線程下載碰到的問題及解決方案

1,網絡請求 只能放在子線程中進行,要是放在主線程中會報錯

URL url1 = newURL(url);
connection=(HttpURLConnection)url1.openConnection();
connection.setConnectTimeout(8000);
connection.setRequestMethod("GET"); 

2,Toast顯示消息放在子線程中要在在其前後加上Looper中兩個方法
Looper.
prepare();
Toast.
makeText(context,"Thread"+ threadId+ "下載成功", Toast.LENGTH_SHORT).show();
Looper.
loop();

3,多線程下載思路:將一個文件分爲多塊,每個線程下載對應的塊大小,網絡端怎麼知道我要下載的大小,


long blcok = blcok = blcok = fSize % threadSize == 0 ? fSize / threadSize : fSize / threadSize + 1;
//線程下載的開始位置
if (threadId == 0)
    startPosition = threadId * block;
else
    startPosition = threadId * block + 1;

Log.d("test", "thread " + threadId + "startPosition: " + startPosition);
//線程下載的結束位置
endPostion = startPosition + block > fSize ? fSize : startPosition + block;
//解決java.lang.IllegalStateException: Cannot set request property after connection is made,錯誤,
在下載文件的代碼中重新建立連接
 HttpURLConnection connection=(HttpURLConnection)new URL(url).openConnection();
// connection.setAllowUserInteraction(true);
 connection.setRequestProperty("Range","bytes="+startPosition+"-"+endPostion);

connection.setRequestProperty("Range","bytes="+startPosition+"-"+endPostion);//這句可以確定我們線程要下載的大小


4,怎麼知道要下載的文件大小,及文件的是按什麼類型的數據下載

在HttpHttpURLConnection中getContentLength()可以獲取文件的大小返回的是字節大小

文件是按字節在網絡端存儲所以應該按字節類型下載,而如何下載呢,可以利用HttpURLConnection對象的

getInputStream()獲取InputStream輸入流放到BufferedInputStream中,根據BufferedInputStream的read方法可以讀取網絡端數據,可以將讀取的數據放入一個緩衝區,緩衝區bytes []buff=new bytes[1024*1024];中
獲取網絡端的數據後將其寫入到本地這裏可以運用RandomAccessFile write = new RandomAccessFile(downFile, "rw");downFile爲文件,"rw"爲可讀可寫
write.seek(startPosition);//這句是設置每個線程的寫入的開頭,以便連接下載好的文件
BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
while ((len = bis.read(buff, 0, buff.length)) != -1) {
    write.write(bufff,0,len);
    count+=len;//count爲單個線程已經下載的大小
}


發佈了32 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章