IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android中利用OkHttp+Retrofit+kotlin协程发出网络请求 -> 正文阅读

[移动开发]Android中利用OkHttp+Retrofit+kotlin协程发出网络请求

目前Android端流行的网络请求模式是,OkHttp+retrofit2+RxJava,但是kotlin协程横空出世之后,RxJava的某些特性与kotlin协程出现了冲突,那我们能抛开RxJava吗? 当然可以,这里,我们示范一种OkHttp+retrofit2+kotlin协程的网络请求模式。

添加依赖

模块的build.gradle添加以下依赖

dependencies {
	implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
}

创建Retrofit对象

val retrofit = Retrofit.Builder()
    .client(HttpClient.get(BaseApplication.getContext(), httpParams, BuildConfig.DEBUG))
    .baseUrl(baseUrl)
    .addConverterFactory(GsonConverterFactory.create(gson))
    //这里我们改为CoroutineCallAdapterFactory
    .addCallAdapterFactory(CoroutineCallAdapterFactory()) 
    .build()

创建网路请求接口文件

interface Api {
   @POST("/api/xxx/xxx/xxx")
   fun loginAsync(@Body body: JsonObject): Deferred<HttpResponse<LoginResult>>
}

与RxJava不同,这里的返回值我们改为Deferred即可

封装下个ApiManager接口

理论上,上面就可以直接用了,但是我们也可以对网络请求的错误做出统一处理,所以封装一个ApiManager类

object ApiManager {
    suspend fun <T> request(deferred: Deferred<HttpResponse<T>>): HttpResponse<T> = withContext(Dispatchers.IO) {
        try {
            return@withContext deferred.await()
        } catch (e: Exception) {
            Log.e("ApiManager", e.message)
            e.printStackTrace()
            val data = createEmpty(e.message.toString())
            val type = object : TypeToken<HttpResponse<T>>() {}.type
            return@withContext GsonUtils.gsonToModel(data, type) as HttpResponse<T>
        } catch (e: Throwable) {
            Log.e("ApiManager","throwable")
            val data = createEmpty("请求错误")
            val type = object : TypeToken<HttpResponse<T>>() {}.type
            return@withContext GsonUtils.gsonToModel(data, type) as HttpResponse<T>
        }
    }

    private fun createEmpty(msg: String): String {
        val map = androidx.collection.ArrayMap<String, Any>()
        map["code"] = 500
        map["msg"] = msg
        return GsonUtils.toJson(map)
    }
}

请求示例

    suspend fun login(userName: String, verifyCode: String): HttpResponse<LoginResult> {
        //xxx
        body.add("clientInfo", clientInfo)
        return request(bmsApi.loginAsync(body))
    }

如上,我们可以用kotlin协程的做法,就像同步请求一样,非常优雅的做出网络请求。

原理

关键代码就在CoroutineCallAdapterFactory类中,我们可以研究下这个类,这里也示范下如何将callback改装为kotlin协程。

  private class ResponseCallAdapter<T>(
      private val responseType: Type
  ) : CallAdapter<T, Deferred<Response<T>>> {

    override fun responseType() = responseType

    override fun adapt(call: Call<T>): Deferred<Response<T>> {
      val deferred = CompletableDeferred<Response<T>>()

      deferred.invokeOnCompletion {
        if (deferred.isCancelled) {
          call.cancel()
        }
      }
	  //进行网络请求
      call.enqueue(object : Callback<T> {
        override fun onFailure(call: Call<T>, t: Throwable) {
          deferred.completeExceptionally(t)
        }

        override fun onResponse(call: Call<T>, response: Response<T>) {
          //返回网络请求结果
          deferred.complete(response)
        }
      })

      return deferred
    }
  }
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:39:08  更:2022-03-08 22:40:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 16:58:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码