偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

鴻蒙HarmonyOS三方件開(kāi)發(fā)指南-Updownfile

開(kāi)發(fā) OpenHarmony
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內(nèi)容請(qǐng)前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術(shù)社區(qū)https://harmonyos.51cto.com

[[383850]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

1. UpDownfile功能介紹

1.1. 功能介紹:

UpDownfile基于Okhttp為基礎(chǔ)進(jìn)行二次封裝,是一款非常好用的文件上傳下載框架,該框架功能強(qiáng)大,主要包含兩方面功能:

(1).文件下載帶進(jìn)度展示

(A).單任務(wù)下載:分為帶參數(shù)和不帶參數(shù),包括暫停下載、繼續(xù)下載功能;

(B).多任務(wù)下載:分為帶參數(shù)和不帶參數(shù),包括暫停下載、繼續(xù)下載功能;

(2).文件上傳帶進(jìn)度展示

(A). 單任務(wù)上傳:分為帶參數(shù)和不帶參數(shù),包括暫停上傳、繼續(xù)上傳功能;

(B). 多任務(wù)上傳:分為帶參數(shù)和不帶參數(shù),包括暫停上傳、繼續(xù)上傳功能;

運(yùn)行截圖如下:

1.2. 使用要求

(1) .在config.json進(jìn)行網(wǎng)絡(luò)以及文件讀寫(xiě)權(quán)限操作

  1. "reqPermissions": [ 
  2.   "reason"""
  3.   "name""ohos.permission.INTERNET" 
  4. }, 
  5. {"reason"""
  6.   "name""ohos.permission.READ_USER_STORAGE" 
  7. }, 
  8. {"reason"""
  9.   "name""ohos.permission.READ_MEDIA" 
  10. }, 
  11. {"reason"""
  12.   "name""ohos.permission.WRITE_USER_STORAGE" 
  13. }, 
  14. {"reason"""
  15.   "name""ohos.permission.WRITE_MEDIA" 

(2) .在實(shí)際使用地方進(jìn)行動(dòng)態(tài)權(quán)限申請(qǐng)

  1. String[] per = {"ohos.permission.READ_USER_STORAGE""ohos.permission.WRITE_MEDIA",  
  2. "ohos.permission.READ_MEDIA""ohos.permission.WRITE_USER_STORAGE"}; 
  3. requestPermissionsFromUser(per, 0); 

1.3. 使用實(shí)例介紹UI

2. UpdownFile使用方法

2.1. 新建工程,增加組件Har包依賴

在應(yīng)用模塊中添加HAR,只需要將updownfile.har復(fù)制到entry\libs目錄下即可(由于build.gradle中已經(jīng)依賴的libs目錄下的*.har,因此不需要再做修改)。

2.2. 斷點(diǎn)續(xù)傳使用方法介紹

(1). 在AbilitySlice里實(shí)現(xiàn)ProgressResponseBody.ProgressListener接口,重寫(xiě)。

  1. @Override 
  2. public void onPreExecute(long contentLength) { 
  3.     // 文件總長(zhǎng)只需記錄一次,要注意斷點(diǎn)續(xù)傳后的contentLength只是剩余部分的長(zhǎng)度 
  4.     if (this.contentLength == 0L) { 
  5.         this.contentLength = contentLength; 
  6.         getUITaskDispatcher().asyncDispatch(new Runnable() { 
  7.             @Override 
  8.             public void run() { 
  9.                 progressBar.setMaxValue((int) (contentLength / 1024)); 
  10.             } 
  11.         }); 
  12.     } 

(2).progressBar設(shè)置進(jìn)度更新的方法如下:

  1. @Override 
  2. public void update(long totalBytes, boolean done) { 
  3.     // 注意加上斷點(diǎn)的長(zhǎng)度 
  4.     this.totalBytes = totalBytes + breakPoints; 
  5.     getUITaskDispatcher().asyncDispatch(new Runnable() { 
  6.         @Override 
  7.         public void run() { 
  8.             progressBar.setProgressValue((int) (totalBytes + breakPoints) / 1024); 
  9.         } 
  10.     }); 
  11.     if (done) { 
  12.         // 切換到主線程 
  13.         getUITaskDispatcher().asyncDispatch(new Runnable() { 
  14.             @Override 
  15.             public void run() { 
  16.                 LogUtil.Toast(getAbility(), "下載完成"); 
  17.             } 
  18.         }); 
  19.     } 
  20. }  

2.3. 初始化下載方法及存儲(chǔ)路徑

  1. file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "windows.exe"); 
  2. downloader = new ProgressDownloader(PACKAGE_URL, file, this); 

2.4. 具體使用方法

(1). 下載:

  1. breakPoints = 0L; 
  2. downloader.download(0L); 
  3. LogUtil.Toast(getAbility(), "開(kāi)始下載"); 

(2). 暫停,開(kāi)啟攔截器

  1. downloader.pause(); 
  2. // 存儲(chǔ)此時(shí)的totalBytes,即斷點(diǎn)位置。 
  3. breakPoints = totalBytes; 
  4. LogUtil.Toast(getAbility(), "下載暫停"); 

(3). 繼續(xù)下載,傳入開(kāi)始下載的位置

  1. downloader.download(breakPoints); 
  2. LogUtil.Toast(getAbility(), "下載繼續(xù)"); 

2.5. 文件上傳使用方法

(1). 單文件上傳,無(wú)需參數(shù)

  1. /** 
  2.  * post請(qǐng)求,上傳單個(gè)文件 
  3.  * @param url:url 
  4.  * @param file:File對(duì)象 
  5.  * @param fileKey:上傳參數(shù)時(shí)file對(duì)應(yīng)的鍵 
  6.  * @param fileType:File類型,是image,video,audio,file 
  7.  * @param callBack:回調(diào)接口,onFailure方法在請(qǐng)求失敗時(shí)調(diào)用,onResponse方法在請(qǐng)求成功后調(diào)用,這兩個(gè)方法都執(zhí)行在UI線程。還可以重寫(xiě)onProgress方法,得到上傳進(jìn)度 
  8.  */ 
  9. public static void okHttpUploadFile(String url, File file,String fileKey, String fileType, CallBackUtil callBack) { 
  10.     okHttpUploadFile(url, file, fileKey,fileType, null, callBack); 

(2). 單文件上傳,需要參數(shù)

  1. /** 
  2.  * post請(qǐng)求,上傳單個(gè)文件 
  3.  * @param url:url 
  4.  * @param file:File對(duì)象 
  5.  * @param fileKey:上傳參數(shù)時(shí)file對(duì)應(yīng)的鍵 
  6.  * @param fileType:File類型,是image,video,audio,file 
  7.  * @param paramsMap:map集合,封裝鍵值對(duì)參數(shù) 
  8.  * @param callBack:回調(diào)接口,onFailure方法在請(qǐng)求失敗時(shí)調(diào)用,onResponse方法在請(qǐng)求成功后調(diào)用,這兩個(gè)方法都執(zhí)行在UI線程。還可以重寫(xiě)onProgress方法,得到上傳進(jìn)度 
  9.  */ 
  10. public static void okHttpUploadFile(String url, File file, String fileKey,String fileType, Map<String, String> paramsMap, CallBackUtil callBack) { 
  11.     okHttpUploadFile(url, file,fileKey, fileType, paramsMap, null, callBack); 

(3). 多文件上傳, List集合形式

  1.   /** 
  2. * post請(qǐng)求,上傳多個(gè)文件,以list集合的形式 
  3. * @param url:url 
  4. * @param fileList:集合元素是File對(duì)象 
  5. * @param fileKey:上傳參數(shù)時(shí)fileList對(duì)應(yīng)的鍵 
  6. * @param fileType:File類型,是image,video,audio,file 
  7. * @param paramsMap:map集合,封裝鍵值對(duì)參數(shù) 
  8. * @param callBack:回調(diào)接口,onFailure方法在請(qǐng)求失敗時(shí)調(diào)用,onResponse方法在請(qǐng)求成功后調(diào)用,這兩個(gè)方法都執(zhí)行在UI線程。 
  9. */ 
  10. ublic static void okHttpUploadListFile(String url, Map<String, String> paramsMap,List<File> fileList, String fileKey, String fileType,  CallBackUtil callBack) { 
  11.    okHttpUploadListFile(url, paramsMap,fileList, fileKey, fileType, null, callBack); 

(4). 多文件上傳, Map形式

  1. /** 
  2.  * post請(qǐng)求,上傳多個(gè)文件,以map集合的形式 
  3.  * @param url:url 
  4.  * @param fileMap:集合key是File對(duì)象對(duì)應(yīng)的鍵,集合value是File對(duì)象 
  5.  * @param fileType:File類型,是image,video,audio,file 
  6.  * @param paramsMap:map集合,封裝鍵值對(duì)參數(shù) 
  7.  * @param headerMap:map集合,封裝請(qǐng)求頭鍵值對(duì) 
  8.  * @param callBack:回調(diào)接口,onFailure方法在請(qǐng)求失敗時(shí)調(diào)用,onResponse方法在請(qǐng)求成功后調(diào)用,這兩個(gè)方法都執(zhí)行在UI線程。 
  9.  */ 
  10. public static void okHttpUploadMapFile(String url, Map<String, File> fileMap, String fileType, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) { 
  11.     new RequestUtil(METHOD_POST, url,paramsMap, fileMap, fileType,  headerMap, callBack).execute(); 

3. UpdownFile開(kāi)發(fā)實(shí)現(xiàn)

3.1. 新建一個(gè)Module

新建一個(gè)Module,類型選擇HarmonyOS Library,模塊名為updownfile,如圖:

3.2. 新建一個(gè)OKhttpUtil類

新建一個(gè)OKhttpUtil類,將下載上傳方法進(jìn)行封裝。

3.3. 新建一個(gè)RequestUtil類

RequestUtil實(shí)現(xiàn)OkhttpUtil的各種方法

3.4. 新建CallBackUti實(shí)現(xiàn)進(jìn)度更新監(jiān)聽(tīng)

通過(guò)EventHandler發(fā)送消息對(duì)下載進(jìn)度實(shí)現(xiàn)回調(diào)監(jiān)聽(tīng),在主線程進(jìn)行UI更新操作。

3.5. 多任務(wù)下載使用方法

(1).多任務(wù)下載原理

創(chuàng)建線程池,點(diǎn)擊單個(gè)下載任務(wù)創(chuàng)建子線程并將子線程加入線程池進(jìn)行管理,將文件信息及更新進(jìn)度信息存入model進(jìn)行單獨(dú)管理,在使用的AblitySlice實(shí)現(xiàn)ProgressResponseBody.ProgressListener接口進(jìn)行進(jìn)度監(jiān)聽(tīng)。

(2). 應(yīng)用層面使用方法

(A). 引入har包,引入方法這里不做介紹

(B). 在AblitySlice實(shí)現(xiàn)ProgressResponseBody.ProgressListener接口,并重寫(xiě)接口的兩個(gè)方法。

  1. @Override 
  2. public void onPreExecute(long contentLength,int postion) { 
  3.     if (list.get(postion).getBean().getContentLength() == 0L) { 
  4.         list.get(postion).getBean().setContentLength(contentLength); 
  5.         list.get(postion).getBean().getProgressBar().setMaxValue((int) (contentLength / 1024)); 
  6.     } 
  7. @Override 
  8. public void update(long totalBytes, boolean done,int postion) { 
  9.     list.get(postion).getBean().setTotalBytes(totalBytes+list.get(postion).getBean().getBreakPoints()); 
  10.     getUITaskDispatcher().asyncDispatch(new Runnable() { 
  11.         @Override 
  12.         public void run() { 
  13.          list.get(postion).getBean().getProgressBar().setProgressValue((int) (list.get(postion).getBean().getTotalBytes()) / 1024); 
  14.         } 
  15.     }); 
  16.     if (done) { 
  17.         // 切換到主線程 
  18.         getUITaskDispatcher().asyncDispatch(new Runnable() { 
  19.             @Override 
  20.             public void run() { 
  21.                 LogUtil.Toast(getAbility(), "下載完成"); 
  22.             } 
  23.         }); 
  24.     } 

(C) .為L(zhǎng)istContainer創(chuàng)建適配器構(gòu)造數(shù)據(jù),實(shí)例如下:

  1. listContainer = (ListContainer) findComponentById(ResourceTable.Id_list); 
  2. //造數(shù)據(jù) 
  3. FileBean fileBean1 = new FileBean(); 
  4. fileBean1.setNum(1); 
  5. fileBean1.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe"); 
  6. fileBean1.setName("下載一.exe"); 
  7. fileBean1.setBean(new ProgressBean(null,0,0)); 
  8. FileBean fileBean2 = new FileBean(); 
  9. fileBean2.setNum(2); 
  10. fileBean2.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe"); 
  11. fileBean2.setName("下載二.exe"); 
  12. fileBean2.setBean(new ProgressBean(null,0,0)); 
  13. FileBean fileBean3 = new FileBean(); 
  14. fileBean3.setNum(3); 
  15. fileBean3.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe"); 
  16. fileBean3.setName("下載三.exe"); 
  17. fileBean3.setBean(new ProgressBean(null,0,0)); 
  18. FileBean fileBean4 = new FileBean(); 
  19. fileBean4.setNum(4); 
  20. fileBean4.setUrl("https://dl.google.com/dl/android/studio/install/3.5.2.0/android-studio-ide-191.5977832-windows.exe"); 
  21. fileBean4.setName("下載四.exe"); 
  22. fileBean4.setBean(new ProgressBean(null,0,0)); 
  23. list.add(fileBean1); 
  24. list.add(fileBean2); 
  25. list.add(fileBean3); 
  26. list.add(fileBean4); 
  27. //初始化適配器 
  28. listItemProvider = new ListItemProvider(list,this,this); 
  29. //設(shè)置適配器 
  30. listContainer.setItemProvider(listItemProvider); 

(D). 在ListContainer的適配器的構(gòu)造方法中進(jìn)行線程池初始化

  1. threadTask= new ThreadTask(ability); 

(E).點(diǎn)擊開(kāi)始下載,創(chuàng)建子線程,并將子線程加入線程池進(jìn)行管理

  1. threadTask.CreatTask(postion,downloader);  

(F).暫停下載方法使用如下:

  1. list.get(i).getProgressDownloader().pause(); 
  2.  存儲(chǔ)此時(shí)的totalBytes,即斷點(diǎn)位置。  list.get(i).getBean().setBreakPoints(list.get(i).getBean().getTotalBytes()); 

(G). 繼續(xù)下載方法使用如下:

  1. list.get(i).getProgressDownloader().download(list.get(i).getBean().getBreakPoints());  

(H). 特別注意,點(diǎn)擊暫停時(shí),必須將當(dāng)前下載的節(jié)點(diǎn)進(jìn)行存儲(chǔ),因?yàn)樵摴?jié)點(diǎn)在重新下載時(shí)會(huì)當(dāng)作 下載的起始位置。存儲(chǔ)方法如下

  1. list.get(i).getBean().setBreakPoints(list.get(i).getBean().getTotalBytes()); 

3.6. 編譯HAR包

利用Gradle可以將HarmonyOS Library庫(kù)模塊構(gòu)建為HAR,構(gòu)建HAR的方法如下:

在Gradle構(gòu)建任務(wù)中,HAR包括生產(chǎn)和測(cè)試版本,雙擊PackageDebugHar或PackageReleaseHar任務(wù),構(gòu)建Debug或Release類型的HAR。

待構(gòu)建任務(wù)完成后,可以在工程目錄中的updownfile> bulid > outputs > har目錄中,獲取生成的HAR。

項(xiàng)目源代碼地址:https://github.com/isoftstone-dev/FileDownload_HarmonyOS

歡迎交流:HWIS-HOS@isoftstone.com

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來(lái)源: 鴻蒙社區(qū)
相關(guān)推薦

2021-02-24 15:22:47

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2021-01-13 09:40:31

鴻蒙HarmonyOS開(kāi)發(fā)

2021-04-16 09:28:18

鴻蒙HarmonyOS應(yīng)用

2021-02-04 13:06:38

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2021-06-28 14:48:03

鴻蒙HarmonyOS應(yīng)用

2021-02-26 14:15:27

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2021-02-04 09:45:19

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2021-01-18 09:52:20

鴻蒙HarmonyOS開(kāi)發(fā)

2021-01-21 13:21:18

鴻蒙HarmonyOSPhotoview組件

2021-01-12 12:04:40

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2021-01-20 09:54:56

鴻蒙HarmonyOS開(kāi)發(fā)

2021-03-01 14:01:41

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2021-01-22 17:33:03

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2021-05-12 15:17:39

鴻蒙HarmonyOS應(yīng)用

2021-03-31 09:50:25

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2021-04-12 09:36:54

鴻蒙HarmonyOS應(yīng)用

2021-03-19 17:42:01

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2021-04-20 09:42:20

鴻蒙HarmonyOS應(yīng)用開(kāi)發(fā)

2021-03-10 15:03:40

鴻蒙HarmonyOS應(yīng)用

2023-02-07 15:43:13

三方庫(kù)適配鴻蒙
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)