HarmonyOS三方件开发指南(11)——Updownfile

Stella981
• 阅读 618

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

目录:

1. UpDownfile功能介绍

2. UpdownFile使用方法

3. UpdownFile开发实现

4.《HarmonyOS三方件开发指南》系列文章合集

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

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

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

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

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

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

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

运行截图如下:

  HarmonyOS三方件开发指南(11)——Updownfile

HarmonyOS三方件开发指南(11)——Updownfile

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
 HarmonyOS三方件开发指南(11)——Updownfile

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<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:上传参数时fileList对应的键
 * @param fileType:File类型,是image,video,audio,file
 * @param paramsMap:map集合,封装键值对参数
 * @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。
 */
public 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对象对应的键,集合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<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开发实现
3.1. 新建一个Module
新建一个Module,类型选择HarmonyOS Library,模块名为updownfile,如图

HarmonyOS三方件开发指南(11)——Updownfile

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

HarmonyOS三方件开发指南(11)——Updownfile

3.3. 新建一个RequestUtil类
RequestUtil实现OkhttpUtil的各种方法

HarmonyOS三方件开发指南(11)——Updownfile

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

HarmonyOS三方件开发指南(11)——Updownfile

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。

HarmonyOS三方件开发指南(11)——Updownfile

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

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

作者:软通田可辉

想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
3年前
HarmonyOS三方件开发指南(13)
鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑【课程入口】(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fharmonyos.51cto.com%2Factivity%2F43%23kyzg)目录:1\.SwipeLayou
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这