kotlin 用协程做网络请求_Kotlin + 协程 + Retrofit + MVVM优雅的实现网络请求

本文介绍了如何使用Kotlin协程、Retrofit和MVVM模式进行优雅的网络请求。通过创建RetrofitClient,定义service接口,使用Deferred替换Call,并结合ViewModel和LiveData进一步封装,实现网络请求在后台线程中执行,避免阻塞主线程。提供了项目配置、简单网络请求的步骤以及完整的实现思路。
摘要由CSDN通过智能技术生成

d7cc9fb518bd7da5efa6ea869cbc7615.png

黑客技术 点击右侧关注,了解黑客的世界! 5fb2e63bd739dfbf6338607c39894448.png

016fce0ba22da31b6b297c645321ba55.png

Linux编程 点击右侧关注,免费入门到精通! 5fb2e63bd739dfbf6338607c39894448.png

5e91a295e5aef10ffd8d201be83adf47.png

程序员严选 甄选正品好物,程序员生活指南! 5fb2e63bd739dfbf6338607c39894448.png
作者丨Android进阶开发https://www.jianshu.com/p/eb7c5163b87d
前言

最近一直闭关修炼Kotlin,说实话真香真好用,刚好公司准备交给我一个新项目,于是打算直接用Kotlin来构建项目。刚好整体架构搭建完毕了,于是把网络请求这一部分先分享给大家。这次使用到的是 协程+ retrofit +mvvm的模式,我这儿直接用一个简单的demo来看一下具体的实现方式吧。文章只是描述实现思路,需要demo的直接跳到文末

项目配置

首先先引入所需要的依赖


implementation 'android.arch.lifecycle:extensions:1.1.1' //协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1' //retrofit + okHttp3 implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'

实现思路


不管设计模式这些,先来一个简单的网络请求,就retrofit的基本实现,看看需要哪些步骤


1.创建retrofit

~~~
    val retrofit = Retrofit.Builder()
                .baseUrl(RetrofitClient.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(CoroutineCallAdapterFactory())
                .build()
~~~

2.创建service接口

interface RequestService {@GET("wxarticle/chapters/json")fun getDatas() : Call
    }

3.发起请求

    val service = retrofit.create(RequestService::class.java)
    service.getDatas().enqueue(object : Callback {override fun onFailure(call: retrofit2.Call<DataBean>, t: Throwable) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }override fun onResponse(call: retrofit2.Call<DataBean>, response: Response<DataBean>) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }
    })

这只是描述了一个retrofit的简单请求方式,实际项目中基本上都会封装之后再使用,也为了提高代码的可读性,降低各部分的耦合性,


通俗点来说,只有各司其职才能把工作干好嘛,接下来咱们就围绕着各司其职来一个一个实现

协程实现

接下来把上面的请求换成协程的方式来实现


1.创建RetrofitClient


object为了使RetrofitClient 只能有一个实例

    object RetrofitClient {val BASE_URL =  "https://wanandroid.com/"val reqApi by lazy {val retrofit = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(CoroutineCallAdapterFactory())
                    .build()return@lazy retrofit.create(RequestService::class.java)
        }
    }

2.创建service接口类

interface RequestService {@GET("wxarticle/chapters/json")fun getDatas() : Deferred
}

因为我们后续会使用到协程,所以这儿将Call换成了Deferred


3.发起请求

    GlobalScope.launch(Dispatchers.Main) {
        withContext(Dispatchers.IO){
          val dataBean = RetrofitClient.reqApi.getDatas().await()
        }//更新ui
    }

上面用到了协程,这儿只讲述他的应用了,具体的移步官方文档进一步了解。


网络请求在协程中,并且在IO调度单元,所以不用担会阻塞主线程

协程 + ViewModel + LiveData实现

上面也只是简单的实现,只不过是换成了协程,在项目中,还可以进一步封装,方便使用前面也提到了MVVM,所以还用到了Android 新引入的组件架构之ViewModel和LiveData,先看ViewModel的实现

class ScrollingViewModel  : ViewModel() {private val TAG = ScrollingViewModel::class.java.simpleNameprivate val datas: MutableLiveData by lazy { MutableLiveData().also { loadDatas() } }private val repository = ArticleRepository()fun getActicle(): LiveData {return datas
    }private fun loadDatas() {
        GlobalScope.launch(Dispatchers.Main) {
            getData()
        }// Do an asynchronous operation to fetch users.
    }private suspend fun getData() {val result = withContext(Dispatchers.IO){//            delay(10000)
            repository.getDatas()
        }
       datas.value = result
    }
}

ViewModel将作为View与数据的中间人,Repository专职数据获取,下面看一下Repository的代码,用来发起网络请求获取数据

class ArticleRepository {
     suspend fun getDatas(): DataBean {return RetrofitClient.reqApi.getDatas().await()
      }
  }
在Activity中代码如下private fun initData() {
        model.getActicle().observe(this, Observer{//获取到数据
            toolbar.setBackgroundColor(Color.RED)
        })
    }

结语

通过上面只是描述了一个简单的网络请求协程的实现过程,在项目中我还做了进一步的封装,将几个需要重复创建的类封装了一下,基本上能满足大部分的需求要是感兴趣的小伙伴,可以下载demo参考一下,同时秉持一贯谦虚的风格希望各位大佬能指出不当的地方,深表感谢

附上项目地址

https://github.com/qingtian521/MVVMDemo

 推荐↓↓↓ 

b3a73787ad0225fa99da69628e4b9f08.png

?16个技术公众号】都在这里!

涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。

222dba9f73ce82d14fd65c46d3d1bd0b.png万水千山总是情,点个 “ 在看” 行不行
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值