Kotlin协程+Retrofit、Gson解析

Kotlin协程+Retrofit、Gson解析

添加依赖

implementation "io.github.cnoke.ktnet:api:?"

添写数据基类

open class ApiResponse<T>(    
    var data: T? = null,  
    var errorCode: String = "",     
    var errorMsg: String = ""
)

实现com.cnoke.net.factory.GsonResponseBodyConverter

class MyGsonResponseBodyConverter : GsonResponseBodyConverter() {     
override fun convert(value: ResponseBody): Any {
         val jsonReader = gson.newJsonReader(value.charStream())
         val data = adapter.read(jsonReader) as ApiResponse<*>
         val t = data.data
         val listData = t as? ApiPagerResponse<*>
         if (listData != null) {
             //如果返回值值列表封装类,且是第一页并且空数据 那么给空异常 让界面显示空
             if (listData.isRefresh() && listData.isEmpty()) {
                 throw ParseException(NetConstant.EMPTY_CODE, data.errorMsg)
             }
         }
         // errCode 不等于 SUCCESS_CODE,抛出异常
         if (data.errorCode != NetConstant.SUCCESS_CODE) {
             throw ParseException(data.errorCode, data.errorMsg)
         }
         return t!!
  } }

进行网络请求

 interface TestServer {
     @GET("banner/json")
     suspend fun awaitBanner(): Await<List<Banner>> }
 val okHttpClient = OkHttpClient.Builder()
             .addInterceptor(HeadInterceptor())
             .addInterceptor(LogInterceptor())
             .build()
 val retrofit = Retrofit.Builder()
            .client(okHttpClient)
            .baseUrl("https://www.wanandroid.com/")
						.addCallAdapterFactory(ApiResultCallAdapterFactory())
						.addConverterFactory(GsonConverterFactory.create(ApiResponse::class.java,MyGsonResponseBodyConverter()))                       
						.build()
 val service: TestServer = retrofit.create(TestServer::class.java)
 lifecycleScope.launch {
        val banner = service.awaitBanner().await()
} 

异步请求、同步请求

fun banner(){
    lifecycleScope.launch {
        //单独处理异常 tryAwait会处理异常,如果异常返回空
        val awaitBanner = service.awaitBanner().tryAwait()
        awaitBanner?.let {
            for(banner in it){
                Log.e("awaitBanner",banner.title)
            }
        }

        /**
         * 不处理异常 异常会直接抛出,统一处理
         */
        val awaitBannerError = service.awaitBanner().await()
    }
}

/**
 * 串行 await
 */
fun serial(){
    lifecycleScope.launch {
        //先调用第一个接口await
        val awaitBanner1 = service.awaitBanner().await()
        //第一个接口完成后调用第二个接口
        val awaitBanner2 = service.awaitBanner().await()
    }
}

/**
 * 并行 async
 */
fun parallel(){
    lifecycleScope.launch {
        val awaitBanner1 = service.awaitBanner().async(this)
        val awaitBanner2 = service.awaitBanner().async(this)

        //两个接口一起调用
        awaitBanner1.await()
        awaitBanner2.await()
    }
}

协程+OKHttp

加入依赖

//使用kotlin的依赖
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.71"

//在Android中使用协程需要添加此依赖
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0'

初始化OkHttpClient

private lateinit var client: OkHttpClient
private lateinit var builder: OkHttpClient.Builder

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreat
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值