編輯:Android開發教程
項目源碼下載
https://github.com/Wang-Jun-Chao/AndroidProjects
多線程下載
原理:服務器CPU分配給每條線程的時間片相同,服務器帶寬平均分配給每條線程,所以客戶端開啟的線程越多,就能搶占到更多的服務器資源
發送http請求至下載地址
String path =
URL url = new URL(path)
HttpURLConnection conn = (HttpURLConnection) url()
conn()
conn()
conn()
獲取文件總長度,然後創建長度一致的臨時文件
(conn.getResponseCode() ==){
length = conn.getContentLength();
RandomAccessFile raf = RandomAccessFile(getFileName(path), );
raf.setLength(length);
raf.();
確定線程下載多少數據
blockSize = / THREAD_COUNT;
( = ; <= ; ++){
startIndex = ( - ) * blockSize;
endIndex = * blockSize - ;
( == THREAD_COUNT){
endIndex = length;
}
new DownLoadThread(startIndex, endIndex, )();
}
String path = ;
URL url = URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout);
conn.setConnectTimeout);
conn.setRequestMethod();
conn.setRequestProperty(, + startIndex + + endIndex);
conn.connect();
* 下載請求到的數據,存放至臨時文件中
(conn.getResponseCode() ==){
InputStream is = conn.getInputStream();
RandomAccessFile raf = RandomAccessFile(getFileName(path), );
raf.seek(startIndex);
[] b = ];
;
while(( = is.read(b)) !=){
raf.write(b,, );
}
raf.();
}
帶斷點續傳的多線程下載
定義一個int變量記錄每條線程下載的數據總長度,然後加上該線程的下載開始位置,得到的結果就是下次下載時,該線程的開始位置,把得到的結果存入緩存文件
total =;
while(( = is.read(b)) !=){
raf.write(b,, );
total += ;
RandomAccessFile raf2 = RandomAccessFile(threadId + , );
raf2.write((startIndex + total + ).getBytes());
raf2.();
}
下次下載開始時,先讀取緩存文件中的值,得到的值就是該線程新的開始位置
FileInputStream fis = FileInputStream();
BufferedReader br = BufferedReader( InputStreamReader(fis));
text = br.readLine();
int newStartIndex = .parseInt(text);
//把讀到的值作為新的開始位置
startIndex = newStartIndex;
fis.close();
三條線程都下載完畢之後,刪除緩存文件
RUNNING_THREAD--;
(RUNNING_THREAD == ){
( i = ; i <= ; i++){
File f = File(i + );
f.();
}
}
手機版的斷點續傳多線程下載器
把剛才的代碼直接粘貼過來就能用,記得在訪問文件時的路徑要改成Android的目錄,添加訪問網絡和外部存儲的路徑
拿到下載文件總長度時,設置進度條的最大值
pb.setMax();
進度條需要顯示三條線程的整體下載進度,所以三條線程每下載一次,就要把新下載的長度加入進度條
定義一個int全局變量,記錄三條線程的總下載長度
progress;
* 刷新進度條
while(( = is.read(b)) !=){
raf.write(b,, );
progress += ;
pb.setProgress(progress);
每次斷點下載時,從新的開始位置開始下載,進度條也要從新的位置開始顯示,在讀取緩存文件獲取新的下載開始位置時,也要處理進度條進度
FileInputStream fis = FileInputStream(file);
BufferedReader br = BufferedReader( InputStreamReader(fis));
String text = br.readLine();
newStartIndex = Integer.parseInt(text);
alreadyDownload = newStartIndex - startIndex;
progress += alreadyDownload;
tv(progress * / pb() + )
HttpUtils的使用
HttpUtils本身就支持多線程斷點續傳,使用起來非常的方便
創建HttpUtils對象
=
下載文件
http.download(url,
target,
,
,
RequestCallBack<File>() {
(ResponseInfo<File> arg0) {
tv.setText( + arg0.result.getPath());
}
(HttpException arg0, String arg1) {
tv.setText( + arg1);
}
( total, current, isUploading) {
.onLoading(total, current, isUploading);
pb.setMax(() total);
pb.setProgress(() current);
tv_progress.setText(current * / total + );
}
});
更多精彩內容:http://www.bianceng.cn/OS/extra/
Android Studio 的 Preview窗口
Android Studio的功能包含preview窗口, 可以查看布局(layout)的樣式;位置: app->src->main->res(資源)-
Android開發入門(十五)使用菜單 15.2 選項菜單
現在,我們就可以去修改上一節中的項目了。這樣,在用戶按menu鍵的時候就會彈出選項菜單了。1. 使用上一節中的工程,在MenusActivity.java中添加一些代碼。
Office Mobile for Android移動辦公軟件
微軟已經正式公布了Office Mobile for Android移動辦公軟件,這是繼iPhone版後又一個移動平台的辦公產品。對於Office 365的訂閱用戶來說,
Android自定義View之實現理財類APP七日年化收益折線圖效果
這段時間的自定義View學習,學會了繪制柱狀圖、繪制折線圖、繪制進度控件,那我們今天就來聊聊另外一種自定義的View,這就是我們常見的七日年化收益折線圖效果。先看看長什麼