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


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

    目录:
    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复制到entrylibs目录下即可(由于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

  • 相关阅读:
    阿里云HPC助力新制造 | 上汽仿真计算云SSCC
    阿里云数据库备份DBS商业化发布,数据库实时备份到OSS
    一张图读懂数据库备份
    数据库智能管理助手-CloudDBA
    重新定义数据库的时刻,阿里云数据库专家带你了解POLARDB
    时间序列数据的处理
    【大量干货】史上最完整的Tengine HTTPS原理解析、实践与调试
    ECS主动运维事件--让你HOLD住全场 (二)
    【52.49%】【codeforces 556A】Case of the Zeros and Ones
    【66.47%】【codeforces 556B】Case of Fake Numbers
  • 原文地址:https://www.cnblogs.com/HarmonyOS/p/14434508.html
Copyright © 2020-2023  润新知