设计模式只看不练可不行,写个上传解耦库练练手(下)

简介: 写个上传解耦库练练手

⑤ 自定义后拦截器


对响应数据进行处理,如字符串解析显示


class SimpleParsingInterceptor: Interceptor {
    override fun intercept(chain: Interceptor.Chain): Task {
        val task = chain.task()
        if(task is ImageTask) {
            task.response?.let {
                var tempContent = it.content
                if(tempContent.startsWith("{")) {
                    val index: Int = tempContent.indexOf("{")
                    tempContent = tempContent.substring(index)
                }
                try {
                    val jsonObject = JSONObject(tempContent)
                    if (jsonObject.getInt("code") == 200) {
                        //解析服务端回传内容
                        val mapJson: JSONObject = jsonObject.getJSONObject("data")
                        var key = ""
                        var image = ""
                        val ite = mapJson.keys()
                        while (ite.hasNext()) {
                            key = ite.next()
                            image = mapJson[key] as String
                        }
                        task.fileUrl = image
                        task.fileUrl?.logV()
                    } else {
                        jsonObject.toString().logV()
                    }
                } catch (e: Exception) {
                    e.message?.logD()
                }
            }
        }
        return chain.proceed(task)
    }
}


⑥ 初始化


可以不在App类中初始化,只要保证在upload前init()了就行~


LightUpload.init(LightUploadBuilder()
        // 传入默认配置,可变参数,支持多种类型Task的定制
        .config(LightUploadTask.IMAGE to ImageUploadConfig().apply {
            reqData = ReqData(
                uploadUrl = "http://127.0.0.1:5000/upload",
                requestMethod = "POST",
                headers = hashMapOf(
                    "Charset" to "utf-8",
                    "connection" to "keep-alive"
                )
            )
        }, LightUploadTask.VIDEO to VideoUploadConfig()
            .apply {
            reqData = ReqData(
                uploadUrl = "http://127.0.0.1:5000/upload",
                requestMethod = "POST",
                headers = hashMapOf(
                    "Charset" to "utf-8",
                    "connection" to "keep-alive"
                )
            )
        })
        // 设置上传请求,同样也是可变参数,支持多种类型定制
        .upload(LightUploadTask.IMAGE to HucUpload())
        // 添加前拦截器
        .addBeforeInterceptor(PictureRotateInterceptor())
        .addBeforeInterceptor(PictureCompressInterceptor())
        .addBeforeInterceptor(VideoCompressInterceptor())
        .addBeforeInterceptor(VideoFrameInterceptor())
        // 添加后拦截器
        .addDoneInterceptors(SimpleParsingInterceptor())
)


⑦ 调用上传


LightUpload.upload(task = CpImageTask().apply {
    filePath = path
    needCompress = true
    compressPercent = (1..100).random()
    callback = object : Upload.CallBack {
        override fun onSuccess(task: Task) {
            // 成功回调
            text = " ${task.response!!.content}\n"
        }
        override fun onFailure(task: Task) {
            // 失败回调
            task.throwable?.message?.let { it1 -> shortToast(it1) }
        }
    }
})


0x5、Demo测试


命令行cd到项目的upload-server项目,第一次运行前执行下述命令安装python脚本相关依赖:


pip install -r pip install requirements.txt


安装完后,键入下述命令运行脚本:


python app.py


然后手机和电脑在同一局域网,配置下代理,输入ipconfig查看本机IP


网络异常,图片无法展示
|


配置下手机,开下charles:


网络异常,图片无法展示
|


运行效果如下:


网络异常,图片无法展示
|


Logcat也可以看到输出信息:


网络异常,图片无法展示
|

Nice~

相关文章
|
6月前
|
设计模式 搜索推荐 数据库连接
第二篇 创建型设计模式 - 灵活、解耦的创建机制
第二篇 创建型设计模式 - 灵活、解耦的创建机制
|
2月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
设计模式 Java
JAVA设计模式16:职责链模式,轻松解耦发送者和接收者
JAVA设计模式16:职责链模式,轻松解耦发送者和接收者
155 0
|
设计模式
[笔记]设计模式实践_SDLGUI封装系列之开源库SDL2_gui编译
[笔记]设计模式实践_SDLGUI封装系列之开源库SDL2_gui编译
106 0
|
设计模式
[笔记]设计模式实践_SDLGUI封装系列之开源库SDL2_gui编译
设计模式实践_SDLGUI封装系列之开源库SDL2_gui编译
200 0
|
设计模式 Java API
|
设计模式
访问者设计模式(Visitor)的生动案例-ASM字节码修改库
访问者设计模式(Visitor)的生动案例-ASM字节码修改库
128 0
|
Python 设计模式 数据格式
开始慢慢学习这本书了。。Python编程实战:运用设计模式、并发和程序库创建高质量程序
没办法,不到设计模式,算法组合这些,在写大一点程序的时候,总是力不从心。。。:( 一开始可能要花很多时间来慢慢理解吧,,这毕竟和《大话设计模式》用的C#语言有点不太一样。。。 书上代码是3版本的,有些库的用法不一样,还要改回2.7的才可以测试。
1309 0

热门文章

最新文章

  • 1
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    44
  • 2
    C++一分钟之-C++中的设计模式:单例模式
    51
  • 3
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    36
  • 4
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    59
  • 5
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    54
  • 6
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    39
  • 7
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 8
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    102
  • 9
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    74
  • 10
    Go语言设计模式:使用Option模式简化类的初始化
    71