編輯: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窗口, 可以查看布局(layout)的樣式;位置: app->src->main->res(資源)-
現在,我們就可以去修改上一節中的項目了。這樣,在用戶按menu鍵的時候就會彈出選項菜單了。1. 使用上一節中的工程,在MenusActivity.java中添加一些代碼。
微軟已經正式公布了Office Mobile for Android移動辦公軟件,這是繼iPhone版後又一個移動平台的辦公產品。對於Office 365的訂閱用戶來說,
這段時間的自定義View學習,學會了繪制柱狀圖、繪制折線圖、繪制進度控件,那我們今天就來聊聊另外一種自定義的View,這就是我們常見的七日年化收益折線圖效果。先看看長什麼