当前位置:   article > 正文

HarmonyOS开发者文档,HarmonyOS三方件开发指南(11)——Updownfile

harmony 上传下载

鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?【课程入口】

目录:

1.  UpDownfile功能介绍

1.1. 功能介绍:

UpDownfile基于Okhttp为基础进行二次封装,是一款非常好用的文件上传下载框架,该框架功能强大,主要包含两方面功能:

(1).文件下载带进度展示

(A).单任务下载:分为带参数和不带参数,包括暂停下载、继续下载功能;

(B).多任务下载:分为带参数和不带参数,包括暂停下载、继续下载功能;

(2).文件上传带进度展示

(A). 单任务上传:分为带参数和不带参数,包括暂停上传、继续上传功能;

(B). 多任务上传:分为带参数和不带参数,包括暂停上传、继续上传功能;

运行截图如下:

29c630ad69442b763ef54e58419b7e42.png

8bd94e6381c91e8051765b31d00998c7.png

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);

1.3. 使用实例介绍UI

7efc7d01bee26649293e049cbd32dd6e.png

2.  UpdownFile使用方法

2.1. 新建工程,增加组件Har包依赖

在应用模块中添加HAR,只需要将updownfile.har复制到entry\libs目录下即可(由于build.gradle中已经依赖的libs目录下的*.har,因此不需要再做修改)。

2.2.  断点续传使用方法介绍

(1). 在AbilitySlice里实现ProgressResponseBody.ProgressListener接口,重写

@Override

public void onPreExecute(long contentLength) {

// 文件总长只需记录一次,要注意断点续传后的contentLength只是剩余部分的长度

if (this.contentLength == 0L) {

this.contentLength = contentLength;

getUITaskDispatcher().asyncDispatch(new Runnable() {

@Override

public void run() {

progressBar.setMaxValue((int) (contentLength / 1024));

}

});

}

}

(2).progressBar设置进度更新的方法如下

@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). 继续下载,传入开始下载的位置

downloader.download(breakPoints);

LogUtil.Toast(getAbility(), "下载继续");

2.5. 文件上传使用方法

(1). 单文件上传,无需参数

/**

* post请求,上传单个文件

* @param url:url

* @param file:File对象

* @param fileKey:上传参数时file对应的键

* @param fileType:File类型,是image,video,audio,file

* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。还可以重写onProgress方法,得到上传进度

*/

public static void okHttpUploadFile(String url, File file,String fileKey, String fileType, CallBackUtil callBack) {

okHttpUploadFile(url, file, fileKey,fileType, null, callBack);

}

(2). 单文件上传,需要参数

/**

* post请求,上传单个文件

* @param url:url

* @param file:File对象

* @param fileKey:上传参数时file对应的键

* @param fileType:File类型,是image,video,audio,file

* @param paramsMap:map集合,封装键值对参数

* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。还可以重写onProgress方法,得到上传进度

*/

public static void okHttpUploadFile(String url, File file, String fileKey,String fileType, Map paramsMap, CallBackUtil callBack) {

okHttpUploadFile(url, file,fileKey, fileType, paramsMap, null, callBack);

}

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

/**

* post请求,上传多个文件,以list集合的形式

* @param url:url

* @param fileList:集合元素是File对象

* @param fileKey:上传参数时fileList对应的键

* @param fileType:File类型,是image,video,audio,file

* @param paramsMap:map集合,封装键值对参数

* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。

*/

public static void okHttpUploadListFile(String url, Map paramsMap,List 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对象对应的键,集合value是File对象

* @param fileType:File类型,是image,video,audio,file

* @param paramsMap:map集合,封装键值对参数

* @param headerMap:map集合,封装请求头键值对

* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。

*/

public static void okHttpUploadMapFile(String url, Map fileMap, String fileType, Map paramsMap, Map headerMap, CallBackUtil callBack) {

new RequestUtil(METHOD_POST, url,paramsMap, fileMap, fileType, headerMap, callBack).execute();

}

3.  UpdownFile开发实现

3.1. 新建一个Module

新建一个Module,类型选择HarmonyOS Library,模块名为updownfile,如图

6d215ab1f0be7890f4a2dc0b41e377f4.png

3.2. 新建一个OKhttpUtil类

新建一个OKhttpUtil类,将下载上传方法进行封装

5166e11574c83ece8c09c690773ee874.png

3.3. 新建一个RequestUtil类

RequestUtil实现OkhttpUtil的各种方法

66d11a7710a4e7371047cd5574dae3b1.png

3.4. 新建CallBackUti实现进度更新监听

通过EventHandler发送消息对下载进度实现回调监听,在主线程进行UI更新操作。

eb47df2dad9a78b20ced82f236a46976.png

3.5. 多任务下载使用方法

(1).多任务下载原理

创建线程池,点击单个下载任务创建子线程并将子线程加入线程池进行管理,将文件信息及更新进度信息存入model进行单独管理,在使用的AblitySlice实现ProgressResponseBody.ProgressListener接口进行进度监听。

(2). 应用层面使用方法

(A). 引入har包,引入方法这里不做介绍

(B). 在AblitySlice实现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创建适配器构造数据,实例如下:

listContainer = (ListContainer) findComponentById(ResourceTable.Id_list);

//造数据

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);

//设置适配器

listContainer.setItemProvider(listItemProvider);

(D). 在ListContainer的适配器的构造方法中进行线程池初始化

threadTask= new ThreadTask(ability);

(E).点击开始下载,创建子线程,并将子线程加入线程池进行管理

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). 特别注意,点击暂停时,必须将当前下载的节点进行存储,因为该节点在重新下载时会当作     下载的起始位置。存储方法如下

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

3.6.  编译HAR包

利用Gradle可以将HarmonyOS Library库模块构建为HAR,构建HAR的方法如下:

在Gradle构建任务中,HAR包括生产和测试版本,双击PackageDebugHar或PackageReleaseHar任务,构建Debug或Release类型的HAR。

待构建任务完成后,可以在工程目录中的updownfile> bulid > outputs > har目录中,获取生成的HAR。

75b90c97def57ee485bc848ff182b7d6.png

项目源代码地址:https://github.com/isoftstone-dev/FileDownload_HarmonyOS

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

作者:软通田可辉

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/315487
推荐阅读
相关标签
  

闽ICP备14008679号