当前位置: 首页 > 科技观察

鸿蒙HarmonyOS三方软件开发指南-Updownfile

时间:2023-03-22 14:21:56 科技观察

更多信息请访问:鸿蒙技术社区与华为官方共建https://harmonyos.51cto.com1.UpDownfile功能介绍1.1.功能介绍:UpDownfile是基于Okhttp的二次封装,是一个非常好用的文件上传下载框架。该框架功能强大,主要包括两个功能:(1)。带进度显示的文件下载(A)。单任务下载:分为带参数和不带参数,包括暂停下载和继续下载功能;(二).多任务下载:分为带参数和不带参数,包括暂停下载和继续下载功能;(2).带进度显示的文件上传(A)。单任务上传:分为带参数和不带参数,包括暂停上传和继续上传功能;(二).多任务上传:分为带参数和不带参数,包括暂停上传和继续上传功能;运行截图如下:1.2.使用要求(1)。在config.json中进行网络和文件读写权限操作"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)。在实际使用的地方申请动态权限String[]per={"ohos.permission.READ_USER_STORAGE","ohos.permission.WRITE_MEDIA","ohos.permission.READ_MEDIA","ohos.permission.WRITE_USER_STORAGE"};requestPermissionsFromUser(per,0);组件Har包依赖在application模块中添加HAR,只需将updownfile.har复制到entry\libs目录下即可(因为build.gradle已经依赖了libs目录下的*.har,所以不需要修改)2.2.断点续传使用介绍(一)。实现AbilitySlice中的ProgressResponseBody.ProgressListener接口并重写。@OverridepublicvoidonPreExecute(longcontentLength){//文件总长度只需要记录一次,需要注意的是断点续传后的contentLength只是剩余部分的长度if(this.contentLength==0L){this.contentLength=contentLength;getUITaskDispatcher().asyncDispatch(newRunnable(){@Overridepublicvoidrun(){progressBar.setMaxValue((int)(contentLength/1024));}});}}(2)。progressBar设置进度更新的方法如下:@Overridepublicvoidupdate(longtotalBytes,booleandone){//注意断点的长度this.totalBytes=totalBytes+breakPoints;getUITaskDispatcher().asyncDispatch(newRunnable(){@Overridepublicvoidrun(){progressBar.setProgressValue((int)(totalBytes+breakPoints)/1024);}});if(done){//切换到主线程getUITaskDispatcher().asyncDispatch(newRunnable(){@Overridepublicvoidrun(){LogUtil.Toast(getAbility(),"下载完成");}});}}2.3。初始下载方式及存放路径file=newFile(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS),"windows.exe");down??loader=newProgressDownloader(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).继续下载,传入开始下载位置downloader.download(breakPoints);LogUtil.Toast(getAbility(),"DownloadContinue");2.5.文件上传使用方法(1).单个文件uploadwithoutparameters/***post请求,上传单个文件*@paramurl:url*@paramfile:文件对象*@paramfileKey:上传参数时文件对应的key*@paramfileType:文件类型,image,video,audio,file*@paramcallBack:回调接口,请求失败时调用onFailure方法,请求成功后调用onResponse方法,这两个方法都在UI线程上执行,也可以重写onProgress方法获取上传progress*/publicstaticvoidokHttpUploadFile(Stringurl,Filefile,StringfileKey,StringfileType,CallBackUtilcallBack){okHttpUploadFile(url,file,fileKey,fileType,null,callBack);}(2)。单文件上传需要参数/***post请求,上传单个文件*@paramurl:url*@paramfile:File对象*@paramfileKey:上传参数时文件对应的key*@paramfileType:文件类型,为图片,video,audio,file*@paramparamsMap:地图集合,封装键值对参数*@paramcallBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用。这两种方法都在UI线程上执行。也可以重写onProgress方法获取上传进度*/publicstaticvoidokHttpUploadFile(Stringurl,Filefile,StringfileKey,StringfileType,MapparamsMap,CallBackUtilcallBack){okHttpUploadFile(url,file,fileKey,fileType,paramsMap,null,打回来);}(3).多文件上传,列表集合形式/***post请求,以列表集合形式上传多个文件*@paramurl:url*@paramfileList:集合元素是一个File对象*@paramfileKey:上传参数时对应的keyfileList*@paramfileType:文件类型,图片,视频,音频,file*@paramparamsMap:地图集合,封装键值对参数*@paramcallBack:回调接口,请求失败时调用onFailure方法,onResponse方法在请求失败时调用成功时调用,这两个方法都在UI线程上执行。*/ublicstaticvoidokHttpUploadListFile(Stringurl,MapparamsMap,ListfileList,StringfileKey,StringfileType,CallBackUtilcallBack){okHttpUploadListFile(url,paramsMap,fileList,fileKey,fileType,null,callBack);(4)。MultiplefilesUpload,Mapform/***post请求,以map集合形式上传多个文件*@paramurl:url*@paramfileMap:collectionkey为File对象对应的key,collectionvalue为File对象*@paramfileType:文件类型,是图片,视频,音频,文件*@paramparamsMap:地图集合,封装键值对参数*@paramheaderMap:地图集合,封装请求头键值对*@paramcallBack:回调接口,onFailure方法请求失败时调用,onResponse方法在请求成功后调用,这两个方法都在UI线程上执行。*/publicstaticvoidokHttpUploadMapFile(Stringurl,MapfileMap,StringfileType,MapparamsMap,MapheaderMap,CallBackUtilcallBack){newRequestUtil(METHOD_POST,url,paramsMap,fileMap,fileType,headerMap,callBack).execute();}3.UpdownFile开发与实现3.1.新建Module新建Module,类型选择HarmonyOSLibrary,模块名称为updownfile,如图:3.2.新建一个OKhttpUtil类新建一个OKhttpUtil类,实现下载和上传方法封装。3.3.新建一个RequestUtil类RequestUtil来实现OkhttpUtil3.4的各种方法。新建一个CallBackUti,实现进度更新监听。通过EventHandler发送消息实现下载进度回调监听,在主线程进行UI更新操作。3.5.如何使用多任务下载(1)。多任务下载原理创建线程池,点击单个下载任务创建子线程并将子线程加入线程池进行管理,并将文件信息和更新进度信息存储在模型中供分开管理。使用的AblitySlice实现ProgressResponseBody.ProgressListener接口用于进度监控。(2).应用层使用方法(一)。引入har包,这里不介绍引入方法(B)。实现AblitySlice中的ProgressResponseBody.ProgressListener接口,重写接口的两个方法。@OverridepublicvoidonPreExecute(longcontentLength,intpostion){if(list.get(postion).getBean().getContentLength()==0L){list.get(postion).getBean().setContentLength(contentLength);list.get(postion).getBean().getProgressBar().setMaxValue((int)(contentLength/1024));}}@Overridepublicvoidupdate(longtotalBytes,booleandone,intpostion){list.get(postion).getBean().setTotalBytes(totalBytes+列表.get(postion).getBean().getBreakPoints());getUITaskDispatcher().asyncDispatch(newRunnable(){@Overridepublicvoidrun(){list.get(postion).getBean().getProgressBar().setProgressValue((int)(list.get(postion).getBean().getTotalBytes())/1024);}});if(done){//切换到主线程getUITaskDispatcher().asyncDispatch(newRunnable(){@Overridepublicvoidrun(){LogUtil.Toast(getAbility(),"下载完成");}});}}(C)。创建一个适配器为ListContainer构造数据,示例如下:listContainer=(ListContainer)findComponentById(ResourceTable.Id_list);//创建数据FileBeanfileBean1=newFileBean();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(newProgressBean(null,0,0));FileBeanfileBean2=newFileBean();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("下载2.exe");fileBean2.setBean(newProgressBean(null,0,0));FileBeanfileBean3=newFileBean();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(newProgressBean(null,0,0));FileBeanfileBean4=newFileBean();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("下载4.exe");fileBean4.setBean(newProgressBean(null,0,0));list.add(fileBean1);list.add(fileBean2);list.add(fileBean3);list.add(fileBean4);//初始化适配器listItemProvider=newListItemProvider(list,this,this);//设置适配器listContainer.setItemProvider(listItemProvider);(四).在ListContainer适配器的构造函数中进行线程池初始化threadTask=newThreadTask(ability);(五).点击开始下载,创建子线程,并将子线程加入线程池管理threadTask.CreatTask(postion,downloader);(F)。暂停下载的方法如下:list.get(i).getProgressDownloader().pause();存储此时的totalBytes,即断点位置list.get(i).getBean().setBreakPoints(list.get(i).getBean().getTotalBytes());(G)。继续下载的方法如下:list.get(i).getProgressDownloader().download(list.get(i).getBean().getBreakPoints());(H)。特别注意,点击Pause时,必须存储当前下载的节点,因为重新下载的起始位置时会使用这个节点作为下载。存储方式如下:list.get(i).getBean().setBreakPoints(list.get(i).getBean().getTotalBytes());3.6.编译HAR包使用Gradle,可以将HarmonyOSLibrary模块构建成HAR,构建HAR的方法如下:在Gradle构建任务中,HAR包括生产版和测试版,双击PackageDebugHar或PackageReleaseHar任务,然后构建Debug或Release类型的HAR。构建任务完成后,可以在项目目录的updownfile>build>outputs>har目录下获取生成的HAR。项目源码地址:https://github.com/isoftstone-dev/FileDownload_HarmonyOS欢迎交流:HWIS-HOS@isoftstone.com更多信息请访问:与华为共建HarmonyOS技术社区https://harmonyos.51cto.com