鴻蒙HarmonyOS三方件開發(fā)指南-Updownfile
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
1. UpDownfile功能介紹
1.1. 功能介紹:
UpDownfile基于Okhttp為基礎(chǔ)進行二次封裝,是一款非常好用的文件上傳下載框架,該框架功能強大,主要包含兩方面功能:
(1).文件下載帶進度展示
(A).單任務(wù)下載:分為帶參數(shù)和不帶參數(shù),包括暫停下載、繼續(xù)下載功能;
(B).多任務(wù)下載:分為帶參數(shù)和不帶參數(shù),包括暫停下載、繼續(xù)下載功能;
(2).文件上傳帶進度展示
(A). 單任務(wù)上傳:分為帶參數(shù)和不帶參數(shù),包括暫停上傳、繼續(xù)上傳功能;
(B). 多任務(wù)上傳:分為帶參數(shù)和不帶參數(shù),包括暫停上傳、繼續(xù)上傳功能;
運行截圖如下:
1.2. 使用要求
(1) .在config.json進行網(wǎng)絡(luò)以及文件讀寫權(quán)限操作
- "reqPermissions": [
- {
- "reason": "",
- "name": "ohos.permission.INTERNET"
- },
- {"reason": "",
- "name": "ohos.permission.READ_USER_STORAGE"
- },
- {"reason": "",
- "name": "ohos.permission.READ_MEDIA"
- },
- {"reason": "",
- "name": "ohos.permission.WRITE_USER_STORAGE"
- },
- {"reason": "",
- "name": "ohos.permission.WRITE_MEDIA"
- }
(2) .在實際使用地方進行動態(tài)權(quán)限申請
- String[] per = {"ohos.permission.READ_USER_STORAGE", "ohos.permission.WRITE_MEDIA",
- "ohos.permission.READ_MEDIA", "ohos.permission.WRITE_USER_STORAGE"};
- requestPermissionsFromUser(per, 0);
1.3. 使用實例介紹UI
2. UpdownFile使用方法
2.1. 新建工程,增加組件Har包依賴
在應(yīng)用模塊中添加HAR,只需要將updownfile.har復制到entry\libs目錄下即可(由于build.gradle中已經(jīng)依賴的libs目錄下的*.har,因此不需要再做修改)。
2.2. 斷點續(xù)傳使用方法介紹
(1). 在AbilitySlice里實現(xiàn)ProgressResponseBody.ProgressListener接口,重寫。
- @Override
- public void onPreExecute(long contentLength) {
- // 文件總長只需記錄一次,要注意斷點續(xù)傳后的contentLength只是剩余部分的長度
- if (this.contentLength == 0L) {
- this.contentLength = contentLength;
- getUITaskDispatcher().asyncDispatch(new Runnable() {
- @Override
- public void run() {
- progressBar.setMaxValue((int) (contentLength / 1024));
- }
- });
- }
- }
(2).progressBar設(shè)置進度更新的方法如下:
- @Override
- public void update(long totalBytes, boolean done) {
- // 注意加上斷點的長度
- this.totalBytes = totalBytes + breakPoints;
- getUITaskDispatcher().asyncDispatch(new Runnable() {
- @Override
- public void run() {
- progressBar.setProgressValue((int) (totalBytes + breakPoints) / 1024);
- }
- });
- if (done) {
- // 切換到主線程
- getUITaskDispatcher().asyncDispatch(new Runnable() {
- @Override
- public void run() {
- LogUtil.Toast(getAbility(), "下載完成");
- }
- });
- }
- }
2.3. 初始化下載方法及存儲路徑
- file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "windows.exe");
- downloader = new ProgressDownloader(PACKAGE_URL, file, this);
2.4. 具體使用方法
(1). 下載:
- breakPoints = 0L;
- downloader.download(0L);
- LogUtil.Toast(getAbility(), "開始下載");
(2). 暫停,開啟攔截器
- downloader.pause();
- // 存儲此時的totalBytes,即斷點位置。
- breakPoints = totalBytes;
- LogUtil.Toast(getAbility(), "下載暫停");
(3). 繼續(xù)下載,傳入開始下載的位置
- downloader.download(breakPoints);
- LogUtil.Toast(getAbility(), "下載繼續(xù)");
2.5. 文件上傳使用方法
(1). 單文件上傳,無需參數(shù)
- /**
- * post請求,上傳單個文件
- * @param url:url
- * @param file:File對象
- * @param fileKey:上傳參數(shù)時file對應(yīng)的鍵
- * @param fileType:File類型,是image,video,audio,file
- * @param callBack:回調(diào)接口,onFailure方法在請求失敗時調(diào)用,onResponse方法在請求成功后調(diào)用,這兩個方法都執(zhí)行在UI線程。還可以重寫onProgress方法,得到上傳進度
- */
- public static void okHttpUploadFile(String url, File file,String fileKey, String fileType, CallBackUtil callBack) {
- okHttpUploadFile(url, file, fileKey,fileType, null, callBack);
- }
(2). 單文件上傳,需要參數(shù)
- /**
- * post請求,上傳單個文件
- * @param url:url
- * @param file:File對象
- * @param fileKey:上傳參數(shù)時file對應(yīng)的鍵
- * @param fileType:File類型,是image,video,audio,file
- * @param paramsMap:map集合,封裝鍵值對參數(shù)
- * @param callBack:回調(diào)接口,onFailure方法在請求失敗時調(diào)用,onResponse方法在請求成功后調(diào)用,這兩個方法都執(zhí)行在UI線程。還可以重寫onProgress方法,得到上傳進度
- */
- public static void okHttpUploadFile(String url, File file, String fileKey,String fileType, Map<String, String> paramsMap, CallBackUtil callBack) {
- okHttpUploadFile(url, file,fileKey, fileType, paramsMap, null, callBack);
- }
(3). 多文件上傳, List集合形式
- /**
- * post請求,上傳多個文件,以list集合的形式
- * @param url:url
- * @param fileList:集合元素是File對象
- * @param fileKey:上傳參數(shù)時fileList對應(yīng)的鍵
- * @param fileType:File類型,是image,video,audio,file
- * @param paramsMap:map集合,封裝鍵值對參數(shù)
- * @param callBack:回調(diào)接口,onFailure方法在請求失敗時調(diào)用,onResponse方法在請求成功后調(diào)用,這兩個方法都執(zhí)行在UI線程。
- */
- ublic static void okHttpUploadListFile(String url, Map<String, String> paramsMap,List<File> fileList, String fileKey, String fileType, CallBackUtil callBack) {
- okHttpUploadListFile(url, paramsMap,fileList, fileKey, fileType, null, callBack);
(4). 多文件上傳, Map形式
- /**
- * post請求,上傳多個文件,以map集合的形式
- * @param url:url
- * @param fileMap:集合key是File對象對應(yīng)的鍵,集合value是File對象
- * @param fileType:File類型,是image,video,audio,file
- * @param paramsMap:map集合,封裝鍵值對參數(shù)
- * @param headerMap:map集合,封裝請求頭鍵值對
- * @param callBack:回調(diào)接口,onFailure方法在請求失敗時調(diào)用,onResponse方法在請求成功后調(diào)用,這兩個方法都執(zhí)行在UI線程。
- */
- public static void okHttpUploadMapFile(String url, Map<String, File> fileMap, String fileType, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {
- new RequestUtil(METHOD_POST, url,paramsMap, fileMap, fileType, headerMap, callBack).execute();
- }
3. UpdownFile開發(fā)實現(xiàn)
3.1. 新建一個Module
新建一個Module,類型選擇HarmonyOS Library,模塊名為updownfile,如圖:
3.2. 新建一個OKhttpUtil類
新建一個OKhttpUtil類,將下載上傳方法進行封裝。
3.3. 新建一個RequestUtil類
RequestUtil實現(xiàn)OkhttpUtil的各種方法
3.4. 新建CallBackUti實現(xiàn)進度更新監(jiān)聽
通過EventHandler發(fā)送消息對下載進度實現(xiàn)回調(diào)監(jiān)聽,在主線程進行UI更新操作。
3.5. 多任務(wù)下載使用方法
(1).多任務(wù)下載原理
創(chuàng)建線程池,點擊單個下載任務(wù)創(chuàng)建子線程并將子線程加入線程池進行管理,將文件信息及更新進度信息存入model進行單獨管理,在使用的AblitySlice實現(xiàn)ProgressResponseBody.ProgressListener接口進行進度監(jiān)聽。
(2). 應(yīng)用層面使用方法
(A). 引入har包,引入方法這里不做介紹
(B). 在AblitySlice實現(xiàn)ProgressResponseBody.ProgressListener接口,并重寫接口的兩個方法。
- @Override
- public void onPreExecute(long contentLength,int postion) {
- if (list.get(postion).getBean().getContentLength() == 0L) {
- list.get(postion).getBean().setContentLength(contentLength);
- list.get(postion).getBean().getProgressBar().setMaxValue((int) (contentLength / 1024));
- }
- }
- @Override
- public void update(long totalBytes, boolean done,int postion) {
- list.get(postion).getBean().setTotalBytes(totalBytes+list.get(postion).getBean().getBreakPoints());
- getUITaskDispatcher().asyncDispatch(new Runnable() {
- @Override
- public void run() {
- list.get(postion).getBean().getProgressBar().setProgressValue((int) (list.get(postion).getBean().getTotalBytes()) / 1024);
- }
- });
- if (done) {
- // 切換到主線程
- getUITaskDispatcher().asyncDispatch(new Runnable() {
- @Override
- public void run() {
- LogUtil.Toast(getAbility(), "下載完成");
- }
- });
- }
- }
(C) .為ListContainer創(chuàng)建適配器構(gòu)造數(shù)據(jù),實例如下:
- listContainer = (ListContainer) findComponentById(ResourceTable.Id_list);
- //造數(shù)據(jù)
- FileBean fileBean1 = new FileBean();
- fileBean1.setNum(1);
- fileBean1.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe");
- fileBean1.setName("下載一.exe");
- fileBean1.setBean(new ProgressBean(null,0,0));
- FileBean fileBean2 = new FileBean();
- fileBean2.setNum(2);
- fileBean2.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe");
- fileBean2.setName("下載二.exe");
- fileBean2.setBean(new ProgressBean(null,0,0));
- FileBean fileBean3 = new FileBean();
- fileBean3.setNum(3);
- fileBean3.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe");
- fileBean3.setName("下載三.exe");
- fileBean3.setBean(new ProgressBean(null,0,0));
- FileBean fileBean4 = new FileBean();
- fileBean4.setNum(4);
- fileBean4.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe");
- fileBean4.setName("下載四.exe");
- fileBean4.setBean(new ProgressBean(null,0,0));
- list.add(fileBean1);
- list.add(fileBean2);
- list.add(fileBean3);
- list.add(fileBean4);
- //初始化適配器
- listItemProvider = new ListItemProvider(list,this,this);
- //設(shè)置適配器
- listContainer.setItemProvider(listItemProvider);
(D). 在ListContainer的適配器的構(gòu)造方法中進行線程池初始化
- threadTask= new ThreadTask(ability);
(E).點擊開始下載,創(chuàng)建子線程,并將子線程加入線程池進行管理
- threadTask.CreatTask(postion,downloader);
(F).暫停下載方法使用如下:
- list.get(i).getProgressDownloader().pause();
- 存儲此時的totalBytes,即斷點位置。 list.get(i).getBean().setBreakPoints(list.get(i).getBean().getTotalBytes());
(G). 繼續(xù)下載方法使用如下:
- list.get(i).getProgressDownloader().download(list.get(i).getBean().getBreakPoints());
(H). 特別注意,點擊暫停時,必須將當前下載的節(jié)點進行存儲,因為該節(jié)點在重新下載時會當作 下載的起始位置。存儲方法如下
- list.get(i).getBean().setBreakPoints(list.get(i).getBean().getTotalBytes());
3.6. 編譯HAR包
利用Gradle可以將HarmonyOS Library庫模塊構(gòu)建為HAR,構(gòu)建HAR的方法如下:
在Gradle構(gòu)建任務(wù)中,HAR包括生產(chǎn)和測試版本,雙擊PackageDebugHar或PackageReleaseHar任務(wù),構(gòu)建Debug或Release類型的HAR。
待構(gòu)建任務(wù)完成后,可以在工程目錄中的updownfile> bulid > outputs > har目錄中,獲取生成的HAR。
項目源代碼地址:https://github.com/isoftstone-dev/FileDownload_HarmonyOS
歡迎交流:HWIS-HOS@isoftstone.com
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)