打造高效上传体验:基于Kotlin的Android快速上传框架

news2024/12/23 16:48:39

1. 引言

在Android开发中,文件上传操作常常面临各种挑战,为此我开源了一个高效、易用的快速上传框架,助力开发者轻松实现文件上传功能。 GitHub项目地址: 点我

2. 框架特点概述

  • 纯Kotlin编写:简洁、现代的编程语言。
  • MVVM架构:利用ViewModel、LiveData和Lifecycle组件。
  • 高效的协程:异步处理上传任务,保证界面流畅。
  • OkHttp封装:稳定可靠的HTTP请求处理。

3. 效果预览

单文件上传模式单文件上传模式多个文件上传多个文件同时上传模式
单文件上传模式单文件上传模式多个文件上传多个文件同时上传模式

4. 快速开始

依赖配置

  • 添加仓库
// build.gradle(Project:)
allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}
  • 添加依赖
// build.gradle(Module:)
dependencies {
    implementation 'com.github.XJ-Up:quickupload:1.0.0'
}

5.详细使用说明

第一步 Application进行初始化配置

//defaultNotificationChannel用于后台服务需自行createNotificationChannel详情见demo(startForegroundService)
//debug 用于是否打印日志
 UploadConfiguration.initialize(
            context = this,
            defaultNotificationChannel = notificationChannelID,
            debug = BuildConfig.DEBUG
        )

第二步 创建并启动上传任务(可分开)

单文件
//单文件
     QuickUploadRequest(this, serverUrl = "你的上传地址")
                    .setMethod("POST")
                    .addFileToUpload(
                        filePath = mPath, //文件地址(注意:content://也行哦)
                        parameterName = "files" //后台服务接收的参数名
                    )
                    .setResumedFileStart(0)//如果需要断点续传调用此方法,默认情况下不需要调用
                    .setUploadID("1")
                    .startUpload()
多文件同时上传
//同时多文件(不支持断点续传)
 QuickUploadRequest(this, serverUrl = "你的上传地址")
                    .setMethod("POST")
                    .apply {
                        filePath.forEachIndexed { index, s ->
                            addFileToUpload(
                                filePath = s,
                                parameterName = "files"
                            )
                        }
                    }
                    .setUploadID("2")
                    .startUpload()
断点续传
   //如果需要断点续传调用此方法,默认情况下不需要调用(注意:0或不传效果都是重新上传,此方法必须在startUpload之前调用)
   //参数传入上次断点位置(一般这个位置通过后台服务器获取)
   quickUploadRequest.setResumedFileStart(0)
                  

第三步 监听上传获取上传详情

   RequestLiveData(this,object :RequestObserverDelegate{
            override fun onCompleted(context: Context, uploadInfo: UploadInfo) {
                //上传完成时调用 ,注意:成功或错误都会触发
            }

            override fun onCompletedWhileNotObserving() {
                //仅在监听单个上传ID并注册请求观察者时调用
            }

            override fun onError(context: Context, uploadInfo: UploadInfo, exception: Throwable) {
                //出现异常时
            }

            override fun onProgress(context: Context, uploadInfo: UploadInfo) {
                //上传中进度
            }

            override fun onSuccess(
                context: Context,
                uploadInfo: UploadInfo,
                serverResponse: ServerResponse
            ) {
                //上传成功时
            }

            override fun onWait(context: Context, uploadInfo: UploadInfo) {
                //加入上传队列,但不一定开始上传时
            }
        })

自定义日志

     	    Logger.setDelegate(object : Logger.Ext{
           override fun debug(component: String, uploadId: String, message: String) {
              
           }

           override fun error(
               component: String,
               uploadId: String,
               message: String,
               exception: Throwable?
           ) {
              
           }

           override fun info(component: String, uploadId: String, message: String) {
              
           }

       })

配置或管理 API

        quickUploadRequest.addArrayParameter()//将具有多个值的参数添加到此上传请求中
        quickUploadRequest.addHeader()//向此上传请求添加标头
        quickUploadRequest.addParameter()//为该上传请求添加一个参数
        quickUploadRequest.setMethod()//设置要使用的HTTP方法
        quickUploadRequest.setMaxRetries()//设置发生错误时库将尝试的最大重试次数
        quickUploadRequest.setAutoDeleteFilesAfterSuccessfulUpload()//设置上传成功后自动删除文件
        quickUploadRequest.setUploadID()//设置上传id



        UploadConfiguration.dispatcher= //设置自定义调度器
        UploadConfiguration.maxConcurrentTasks=//设置最大并发任务数
        UploadConfiguration.retryPolicy=//设置上传服务重试策略 
        UploadConfiguration.defaultNotificationChannel=//设置通知通道
        

具体使用可参考demo

GitHub项目地址: 点我

6.常见问题解答

  • 如何处理上传失败?
    **当上传失败时 RequestLiveData中的 onError 会触发,通过exception参数获取异常信息 ,常见的异常:
    UserCancelledUploadException 用户已取消上传的异常
    UploadError 上传过程错误的异常
    NoNetworkException 网络连接断开的异常。它们都继承Throwable。通过判断异常决定后续处理 **
  • 如何取消上传任务?
UploadService.taskList//获取当前所有活跃的上传任务
UploadService.stopAllUploads()//停止所有活动的上传任务。onError触发。
UploadService.stopUpload(uploadId)//停止特定上传任务
UploadService.stop(context)//如果当前没有正在运行的任务,则停止 UploadService
UploadService.stop(context, forceStop = true) //强制停止 UploadService 中止任何当前正在运行的任务
  • 如何获取上传进度?
    **当上传失败时 RequestLiveData中的 onProgress 会触发,通过 uploadInfo.progressPercent获取 **

7.结语

**希望这个框架能帮助你简化上传任务,提高开发效率。如果你有任何问题或建议,欢迎在GitHub点我上提出Issue或提交Pull Request。让我们一起打造更好的开源项目! **

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1718760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态分配函数参数用二级指针的作用

文章目录 前言一、案例 前言 在一些情况下,我们需要在函数内部动态地分配内存来存储结构体,并且需要在函数外部访问该结构体。在这种情况下,可以使用二级指针作为函数参数来实现动态内存分配,并且在函数外部使用指针访问结构体。…

py黑帽子学习笔记_web攻击

python网络库 py2的urllib2 py3好像把urllib2继承到了标准库urllib,直接用urllib就行,urllib2在urllib里都有对应的接口 py3的urllib get请求 post请求,和get不同的是,先把post请求数据和请求封装到request对象,再…

数字化转型对企业来说意味着什么?

数字化转型是当今社会不可避免的趋势,它的发展其实是多方面因素影响导致的。首先,随着科技的迅速发展,人们对于信息获取和处理的需求越来越强烈,这促使了各行各业都要朝着数字化方向发展。其次,全球化的潮流让企业需要…

制作U启动装win10系统

一、背景 在我们日常上班过程中经常会遇到以下问题: 1、c盘快满了 2、新电脑用着好卡 3、买新电脑不会装系统 二、实现方式 通常我们遇到这种情况 都会选择去电脑专卖店找专人装系统 但是这样又需要花费自己的money,这样显得自己不够专业像个菜鸟&#…

【成品设计】基于STM32单片机的语音远程运算器

《基于STM32单片机的语音远程运算器》 输入端 所需器件: STM32最小系统板。语音识别模块:用于检测语音命令。蓝牙模块:作为主机用于与输出端蓝牙模块进行连接,发送数据。蜂鸣器红色LED:用于语音命令检测错误提示。 …

记录一次云服务器无法连接的排查过程

运行环境:阿里云服务器 故障外显原因:登录失败,操作系统禁用了密码登录方式 控制台监控数据显示云盘读写BPS拉满了 因为之前问过线上售后,让安装了atop监控,,所以先打开atop日志: atop -r /var/log/atop…

揭秘数字货币:比特币背后的技术逻辑

随着科技的飞速发展,数字货币作为一种新兴的经济形态,已经逐渐走入我们的视野。其中,比特币无疑是这一领域的佼佼者。那么,比特币背后的技术逻辑究竟是什么呢?本文将为您揭开这一神秘面纱。 一、区块链技术:比特币的基石 比特币的核心技术就是区块链(Blockchain)。区块…

[Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解

目录 0.子序列 vs 子数组1.最长递增子序列1.题目链接2.算法原理详解3.代码实现 2.摆动序列1.题目链接2.题目链接3.代码实现 0.子序列 vs 子数组 子序列: 相对顺序是跟源字符串/数组是一致的但是元素和元素之间,在源字符串/数组中可以是不连续的一般时间…

前端开发:$nextTick()的使用及原理

目录 前言 $nextTick()的概念 $nextTick()的用法和原理 1、$nextTick()用法 2、$nextTick()原理 $nextTick()的具体使用示例 拓展:面试中考察$nextTick()的底层原理 最后 前言 在前端开发中,涉及到JS原生的使用原理是非常重要的知识点&#xff0…

Spring Boot详解:深入了解与实践

文章目录 1. Spring Boot简介1.1 什么是Spring Boot?1.2 Spring Boot的历史背景1.3 Spring Boot的核心特点 2. Spring Boot的核心概念2.1 自动配置2.1.1 自动配置原理2.1.2 自定义配置 2.2 Spring Boot Starter2.3 Spring Boot CLI 3. Spring Boot的主要功能模块3.1…

Microsoft Dynamics 365 Business Central 讲解VAT RATE CHANGE TOOL(增值税税率更改工具)

学习目标: 如果使用VAT RATE CHANGE TOOL(增值税税率更改工具) 过程演示: 1.创建新的VAT产品过账组 2.创建新的总账科目以过账采购、销售和逆向征收增值税。 3.给新的VAT产品过账设置过账设置 4.创建一个新的一般产品过账组 5…

百度地图1

地图的基本操作 百度地图3.0文档 百度地图3.0实例中心 设置地图 centerAndZoom(center: Point, zoom: Number)设初始化地图,center类型为Point时,zoom必须赋值,范围3-19级, // 百度地图API功能var map new BMap.Map("map"); //…

element-plus关于表单数据自定义参数校验

element-plus关于表单数据自定义参数校验 核心点&#xff1a; 代码&#xff1a; <el-form-item :prop"tableData[ scope.$index ].score":rules"[{ required: true, message: 得分不能为空, trigger: blur },{ validator: (rule: any, value: any, ca…

2024最新群智能优化算法:大甘蔗鼠算法(Greater Cane Rat Algorithm,GCRA)求解23个函数,提供MATLAB代码

一、大甘蔗鼠算法 大甘蔗鼠算法&#xff08;Greater Cane Rat Algorithm&#xff0c;GCRA&#xff09;由Jeffrey O. Agushaka等人于2024年提出&#xff0c;该算法模拟大甘蔗鼠的智能觅食行为。 参考文献 [1]Agushaka J O, Ezugwu A E, Saha A K, et al. Greater Cane Rat Alg…

Whisper-AT:抗噪语音识别模型(Whisper)实现通用音频事件标记(Audio Tagger)

本文介绍一个统一音频标记&#xff08;Audio Tagger&#xff09;和语音识别&#xff08;ASR&#xff09;的模型&#xff1a;Whisper-AT&#xff0c;通过冻结Whisper的主干&#xff0c;并在其之上训练一个轻量级的音频标记模型。Whisper-AT在额外计算成本不到1%的情况下&#xf…

MySQL 命令总结篇-思维导图

一些常用命令以思维导图形式总结在这里了&#xff0c;掌握这些进行MySQL基本操作绝对没问题&#xff0c;加油&#xff01;友友们可以根据这些思维导图进行知识总结。 目录 一、快速上手 二、SQL 语句分类&#xff08;DDL、DML、DQL、DCL&#xff09; 三、数据类型 四、约束…

图书管理系统——Java实现

文章目录 Java实现图书管理系统问题分析框架搭建业务实现项目测试代码演示BookioperationUserMain&#xff08;默认包&#xff09; Java实现图书管理系统 学习了前六篇的SE语法&#xff0c;我们现在要用它们实现一个简单的图书管理系统项目&#xff0c;深入了解各个知识点的应…

阿里云CDN流量被盗刷或CC攻击会怎么样?

最近&#xff0c;一位使用了阿里云CDN的站长向主机吧反应&#xff0c;其域名使用的阿里云CDN不知道是因为被盗刷还是被CC攻击&#xff0c;导致不仅原本帐号上的3T流量包用完了&#xff0c;连帐户也欠了几百元的流量费。 而产生这么多流量的只是晚上睡一觉起来&#xff0c;手机…

SpringCloud如何实现SSO单点登录?

目录 一、SpringCloud框架介绍 二、什么是SSO单点登录 三、单点登录的必要性 四、SpringCloud如何实现SSO单点登录 一、SpringCloud框架介绍 Spring Cloud是一个基于Spring Boot的微服务架构开发工具集&#xff0c;它整合了多种微服务解决方案&#xff0c;如服务发现、配置…

Element ui 快速入门(基础知识点)

element ui官网 前言&#xff1a; 在当今时代&#xff0c;我们在编写计算机程序时&#xff0c;不仅仅是写几个增删改查的简单功能&#xff0c;为了满足广大用户对页面美观的需求&#xff0c;为了让程序员们写一些功能更简便&#xff0c;提高团队协作效率&#xff0c;所以eleme…