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

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

⑤ 自定义后拦截器


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


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:职责链模式,轻松解耦发送者和接收者
157 0
|
设计模式
[笔记]设计模式实践_SDLGUI封装系列之开源库SDL2_gui编译
[笔记]设计模式实践_SDLGUI封装系列之开源库SDL2_gui编译
108 0
|
设计模式
[笔记]设计模式实践_SDLGUI封装系列之开源库SDL2_gui编译
设计模式实践_SDLGUI封装系列之开源库SDL2_gui编译
200 0
|
设计模式 Java API
|
设计模式
访问者设计模式(Visitor)的生动案例-ASM字节码修改库
访问者设计模式(Visitor)的生动案例-ASM字节码修改库
129 0
|
Python 设计模式 数据格式
开始慢慢学习这本书了。。Python编程实战:运用设计模式、并发和程序库创建高质量程序
没办法,不到设计模式,算法组合这些,在写大一点程序的时候,总是力不从心。。。:( 一开始可能要花很多时间来慢慢理解吧,,这毕竟和《大话设计模式》用的C#语言有点不太一样。。。 书上代码是3版本的,有些库的用法不一样,还要改回2.7的才可以测试。
1310 0