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

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()//设置上传idUploadConfiguration.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.mzph.cn/web/19635.shtml

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

相关文章

提升船舶安全性与效率:隔离驱动芯片的应用

随着科技的不断发展,船舶行业也在不断迎来新的技术革新,其中隔离驱动芯片作为一种关键的电子元件,在船舶领域发挥着重要作用。本文将深入探讨隔离驱动芯片在船舶领域的应用及其技术特点。 隔离驱动芯片提升船舶系统安全性 船舶作为大型交通工…

C盘文件被格式化了,要怎么恢复?

C盘通常是操作系统(如Windows)的默认安装目录。它包含了操作系统的核心文件、驱动程序及系统所需的各种支持文件。这些文件对于计算机的正常运行至关重要。但在使用的过程中,有时可能会因为各种原因导致C盘被格式化,从而丢失了这些重要文件。这无疑是一个…

模型构建器之迭代器

上一篇我们介绍了模型构建器的基础,将一个工作流串联起来,然后做成模型工具。今天我们介绍模型构建器的第二个重要功能——迭代,也就是程序中的循环。 先来看一个例子。要给数据库中所有要素类添加一个相同的字段,该怎么做&#…

语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(二)音频数据预处理及去噪算法+Python源码应用

前言 深度学习技术在当今技术市场上面尚有余力和开发空间的,主流落地领域主要有:视觉,听觉,AIGC这三大板块。 目前视觉板块的框架和主流技术在我上一篇基于Yolov7-LPRNet的动态车牌目标识别算法模型已有较为详细的解说。与AIGC相…

2024年5月架构试题

2024年5月份架构师考试真题完整版 截至2024-5-28 19:24:14已全部收录完成 共75道选择题,5道案例题,4道论文题。题目顺序不分先后。 全网最全的2024年5月份架构师考试真题回忆版,包含答案和解析。 选择题 计算机基础 操作系统调度算法 选先来先…

【Linux基础】Linux了解、安装centos虚拟机

【Linux基础】Linux了解、安装centos虚拟机 文章目录 【Linux基础】Linux了解、安装centos虚拟机1、什么是Linux2、Linux安装2.1、使用VMware安装Linux centos72.2、启动虚拟机安装 1、什么是Linux Linux是一套免费使用和自由传播的操作系统。说到操作系统,大家比较…

vscode 远程连接出现问题

终端太小了, 因为终端中有换行符,如果 终端太小会出现问题

Amis源码 embed渲染方法解析(json结构渲染原理):

js sdk中的渲染函数embed使用方式如下: const amis amisRequire("amis/embed"); const amisScoped amis.embed( self.$refs["mnode"],amisJSON, {}, amisEnv); //env会有默认值,默认值与传来的参数进行合并({默认值…

TiDB-从0到1-部署篇

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇 一、TiUP TiUP是TiDB4.0版本引入的集群运维工具,通过TiUP可以进行TiDB的日常运维工作,包括部署、启动、关闭、销毁、弹性扩缩容…

23种软件设计模式——工厂模式

工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。 工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。 通过使…

身份认证与口令攻击

身份认证与口令攻击 身份认证身份认证的五种方式口令认证静态口令动态口令(一次性口令)动态口令分类 密码学认证一次性口令认证S/KEY协议改进的S/KEY协议 其于共享密钥的认证 口令行为规律和口令猜测口令规律口令猜测 口令破解操作系统口令破解Windows密码存储机制Windows密码破…

2024新版二开微信发卡小程序源码卡密系统流支持量主

2024新版二开微信发卡小程序源码卡密系统流支持量主。裂变扩展多种领取模式二次开发的发卡小程序源码,其后台采用PHP编写,支持用户通过付费购卡或者观看视频广告领取卡密,该小程序还支持流量主,因为功能需要,我就进行了…

WinSW使用说明

WinSW使用说明 Windows系统下部署多个java程序 场景: 多个java的jar程序,通常来说一个程序使用一个cmd窗口,通过java -jar xxx.jar 命令来运行。这样如果程序多了打开cmd窗口也就多了。 解决: 通过使用WinSW程序,把ja…

VisualSVN Server/TortoiseSVN更改端口号

文章目录 概述VisualSVN Server端更改端口号TortoiseSVN客户端更改远程仓库地址 概述 Subversion(SVN)是常用的版本管理系统之一。部署在服务器上的SVN Server端通常会在端口号80,或者端口号443上提供服务。其中80是HTTP访问方式的默认端口。…

AndroidFlutter混合开发

为什么要有混合开发 我们知道,Flutter是可以做跨平台开发的,即一份Flutter的Dart代码,可以编译到多个平台上运行。这么做的好处就是,在不降低多少性能的情况下,尽最大可能的节省开发的时间成本,直接将开发…

带文字的短视频:成都鼎茂宏升文化传媒公司

带文字的短视频:视觉与文字的交织艺术 在信息爆炸的时代,短视频以其直观、生动的视觉呈现方式,迅速成为人们获取信息、娱乐休闲的重要渠道。然而,随着人们对内容深度和质量要求的提升,成都鼎茂宏升文化传媒公司单纯的…

项目4 移动电商运维自动化

项目引入 在一次移动电商系统发布更新上,由于我的不小心,错误地删除了生产服务器上的执行代码,导致整个移动电商系统页面都无法访问,最后花很长时间才恢复,这次事故给公司带来了不小的麻烦。 Philip组织整个运维团队进…

多屏多机同控!天途首发瑶光智控地面站

瑶光智控地面站全新发布!高性能处理器,高亮三屏显示。内置天途云控系统,融合图传、控制、存储和数据处理等功能与一体,强大算力,高度集成无人机、无人船、无人车和机械狗等多种无人装备进行云控云算。 内置4G公网通讯模…

LabVIEW调用外部DLL(动态链接库)

LabVIEW调用外部DLL(动态链接库) LabVIEW调用外部DLL(动态链接库)可以扩展其功能,使用外部库实现复杂计算、硬件控制等任务。通过调用节点(Call Library Function Node)配置DLL路径、函数名称和…

Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作

系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作[Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解]还在写0.0… 文章目录 系…