Kotlin 协程(Coroutines)配合使用 Retrofit,网络请求

2023-11-01

第一步 :添加所需依赖 

  //管理生命周期
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
    //添加支持Kotlin协程
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9'
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9"
    //添加Retrofit网络请求依赖
    implementation "com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2"
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    //添加OKhttp相关依赖 可以用来配置其他配置属性
    implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.11.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
    implementation 'com.blankj:utilcode:1.28.1'

第二步 : 这里使用了 Kotlin的 DSL 语法创建了一个 数据返回回调监听

class RetrofitCoroutineDSL<T> {

    internal var onSuccess : ((T) -> Unit)? = null
        private set
    internal var onFail: ((exception: RequestResultException) -> Unit)? = null
        private set
    internal var onComplete : (() -> Unit)? = null
        private set

    fun onSuccess(block : (T) -> Unit){
        this.onSuccess = block
    }

    fun onFail(block: (exception: RequestResultException) -> Unit) {
        this.onFail = block
    }

    fun onComplete(block : () -> Unit){
        this.onComplete = block
    }

    internal fun clean(){
        onSuccess = null
        onComplete = null
        onFail = null
    }
}

这里面包含了 自定义的异常处理(RequestResultException)

public class RequestResultException extends Exception{

    private static final int UNAUTHORIZED = 401;
    private static final int FORBIDDEN = 403;
    private static final int NOT_FOUND = 404;
    private static final int REQUEST_TIMEOUT = 408;
    private static final int INTERNAL_SERVER_ERROR = 500;
    private static final int BAD_GATEWAY = 502;
    private static final int SERVICE_UNAVAILABLE = 503;
    private static final int GATEWAY_TIMEOUT = 504;
    private static final int CONTENT_IS_TOO_LARGE = 413;

    private HttpResult result;
    private String errorMessage;
    private String errorType;
    private Throwable throwable;

    public RequestResultException(@NotNull Throwable throwable) {
        throwable.printStackTrace();
        this.throwable = throwable;
        if (throwable instanceof HttpException){
            switch (((HttpException) throwable).code()){
                case CONTENT_IS_TOO_LARGE:
                    errorMessage = "内容过大:"+((HttpException) throwable).code();
                    break;
                case UNAUTHORIZED:
                case FORBIDDEN:
                case NOT_FOUND:
                case REQUEST_TIMEOUT:
                case GATEWAY_TIMEOUT:
                case INTERNAL_SERVER_ERROR:
                case BAD_GATEWAY:
                case SERVICE_UNAVAILABLE:
                default:
                    errorMessage = "网络错误:"+((HttpException) throwable).code();
                    break;
            }
            try {
                ResponseBody responseBody = ((HttpException) throwable).response().errorBody();
                if (responseBody != null){
                    String errorMsg = new String(responseBody.bytes());
                    if (!TextUtils.isEmpty(errorMsg)){
                        result = GsonUtils.fromJson(errorMsg, HttpResult.class);
                        errorMessage = result.getMessage();
                        errorType = result.getMessageType();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else if (throwable instanceof JsonParseException
                || throwable instanceof JSONException
                || throwable instanceof ParseException){
            errorMessage = "解析错误";
        }else if (throwable instanceof ConnectException) {
            errorMessage = "连接失败";
        }else if (throwable instanceof SocketTimeoutException){
            errorMessage = "连接超时";
        }else if (throwable instanceof SocketException){
            errorMessage = "连接关闭";
        }else if (throwable instanceof javax.net.ssl.SSLHandshakeException) {
            errorMessage = "证书验证失败";
        }else if (throwable instanceof ResponseMessageException) {
            result = ((ResponseMessageException) throwable).response();
            errorMessage = ((ResponseMessageException) throwable).errorMessage();
            errorType = ((ResponseMessageException) throwable).errorType();
        }else {
            try {
//                errorMessage = "未知错误:"+throwable.getMessage();
                errorMessage = "";
                /*Log.e("未知错误",throwable.getMessage());
                throwable.printStackTrace();*/
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public String getErrorType() {
        return errorType;
    }

    public HttpResult getResult() {
        return result;
    }

    public String getErrorCode(){
        return result != null ? (TextUtils.isEmpty(result.getErrorCode()) ? "" : result.getErrorCode()) : "";
    }

    public Throwable getThrowable() {
        return throwable;
    }
}

public final
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin 协程(Coroutines)配合使用 Retrofit,网络请求 的相关文章

随机推荐

  • Windows 系统cmd设置添加静态路由方式

    电脑上添加静态路由 cmd设置路由 方法 步骤 1 首先在 运行 窗口输入cmd 按WIN R打开运行窗口 然后回车进入命令行 输入 route add 10 253 251 0 mask 255 255 255 0 p 192 254 1
  • 前端实际开发中的命名规范(个人建议)

    如果说计算机科学只存在两个难题 缓存失效和命名 那我觉得前端的命名占有一席之地 让人难以理解的命名方式 单词拼写错误 中英文混用 以数字1 9或者以a z命名 中文拼音命名 强制缩写 命名方法 每个单词之间用 或者 连接 小驼峰 除第一个单
  • JavaScript做简单的购物车效果(增、删、改、查、克隆)

    比如有时候遇到下面这种情况 点击加入购物车 然后在上方的购物车中动态的添加商品以及商品的信息 我们就可以通过JavaScript实现简单的这些操作 首先我们需要在html文档中 通过css对页面的布局做一些简单的设置 并创建两个模板 其di
  • 第二十三节:DOM对象

    DOM概述 DOM 是 JavaScript 操作网页的接口 全称为 文档对象模型 Document Object Model 它的作用是将网页转为一个 JavaScript 对象 从而可以用脚本进行各种操作 比如增删内容 浏览器会根据 D
  • python字典调用键值对作为函数的形参_前端如何学习Python——字典和函数|七日打卡...

    字典 Python 中的字典和 Javascript的对象基本是一样的 添加键值对 user user name david user age 18 print user 复制代码 name david age 18 复制代码 删除键值对
  • RuntimeError: Error(s) in loading state_dict for SENET

    错误提示 RuntimeError Error s in loading state dict for SENET Missing key s in state dict conv1 weight bn1 weight bn1 bias b
  • WebGL(threeJS)给物体打标签

    threeJS给物体打标签有以下几种方法 今天我们就郭老师的例子 依次来看看区别三中标签的区别 今天咱们现年看看效果 下次咱们分析代码 第一种 CSS2DRenderer 官方案例 CSS2DRenderer的标签本身的大小不会缩放也不会旋
  • OD华为机试 19

    分苹果 描述 A B两个人把苹果分为两堆 A希望按照他的计算规则等分苹果 他的计算规则是按照二进制加法计算 并且不计算进位 12 5 9 1100 0101 9 B的计算规则是十进制加法 包括正常进位 B希望在满足A的情况下获取苹果重量最多
  • 2022全年度净水器十大热门品牌销量榜单

    随着人们健康意识的提升 每天喝足量水的观念已经深入人心 而伴随居民生活水平的提高 当下居民对水污染问题也更加关注 对饮水品质的认知和要求也随之升级 因此 净水器在过去几年开启了高速增长的趋势 根据鲸参谋数据显示 2022年京东平台净水器的年
  • docker具名挂载与匿名挂载

    文章分为三部分 什么是具名 匿名和指定路径挂载 匿名挂载 具名挂载 什么是具名 匿名和指定路径挂载 v 容器内路径 匿名挂载 v 卷名 容器内路径 具名挂载 v 宿主机路径 容器内路径 指定路径挂载 拓展 宿主机路径 容器内路径 ro 只读
  • 好书推荐计划:Keras之父作品《Python 深度学习》

    大家好 我禅师的助理兼人工智能排版住手助手条子 可能很多人都不知道我 因为我真的难得露面一次 天天给禅师做底层工作 今天条子终于也熬到这一天 终于也有机会来为大家写文章了 激动的我啊 都忘了9月17号中午和禅师在我厂门口兰州料理吃饭 禅师要
  • C++——关于返回值优化问题

    我们知道 对于一个函数的返回值来说 其是一个对象的拷贝 并且应当是一个右值 我们现在有一个函数 A get A A a 1 return a int mian A get A return 0 这个函数的行为应当是在函数体中构造一个a 然后
  • 浅析React Router V6 useRoutes的使用

    本篇文章记录了useRoutes第一个参数的使用方法 暂不涉及第二个参数 文章目录 一 使用位置 二 嵌套路由 三 分模块管理 注意事项 一 使用位置 一开始以为可以像react router config那样使用 于是写成 import
  • 用 construct 2 制作简易弹幕游戏

    用 construct 2 制作简易弹幕游戏 1 打开construct 2 加入背景 3 建立新的图层 4 在新的图层里加入素材 超人 弹幕 4 加入鼠标 5 给超人和弹幕设置动作 超人的 弹幕的 6 加入文字框 7 编写代码 完成啦
  • TCP/UDP报文格式及各种通信机制简介

    TCP UDP报文格式及各种通信机制简介 一 UDP报文 二 TCP报文 三 TCP通信机制 1 确认应答机制 2 超时重传机制 3 滑动窗口及快重传机制 4 流量控制 5 拥塞控制及慢启动机制 6 延迟应答 7 捎带应答 8 粘包问题 一
  • PLC中的定时器

    1 脉冲定时器 将指令列表中的 生成脉冲 指令TP拖放到梯形图中 在出现的 调用选项 对话框中 将默认的背景数据块的名称改为T1 可以用它来做定时器的标示符 单击 确定 按钮 自动生成背景数据块 定时器的输入IN为启动输入端 PT为预设时间
  • 二叉搜索树的概念 及 功能代码实现

    1 概念 二叉搜索树 又称 二叉排序树 特点 二叉树 每个节点中保存关键字 key 关键字需要具备 比较 的能力 每个节点 都是 大于左子树 小于右子树 二叉树搜索树中 不会出现 相等的 key 中序遍历 一定是 有序的 时间复杂度 最好和
  • 利用Hbuilder将Vue项目打包成apk

    一 配置config index js 本人没有配置index js文件 就开始进行了打包 结果最终效果是页面空白 解决了空白 接着底部图标 我是用的阿里巴巴图片 资源找不到 所以配置这步比较重要 1 页面空白的解决 打开config in
  • uboot2014移植到QT2440

    http bbs chinaunix net thread 4143968 1 1 html
  • Kotlin 协程(Coroutines)配合使用 Retrofit,网络请求

    第一步 添加所需依赖 管理生命周期 implementation androidx lifecycle lifecycle livedata ktx 2 2 0 implementation androidx lifecycle lifec