Kotlin + 协程 + Retrofit + MVVM优雅的实现网络请求
时间: 2023-09-27 19:05:47 浏览: 143
Kotlin + 协程 + Retrofit + MVVM 是一种非常优雅的方式来实现网络请求。下面是一个简单的示例:
首先,我们需要添加相关依赖库:
```gradle
// Kotlin协程
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
// Retrofit2
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
// ViewModel和LiveData
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0'
```
接下来,我们创建一个数据类来表示网络请求返回的数据:
```kotlin
data class Response<T>(
val code: Int,
val msg: String,
val data: T?
)
```
然后,我们创建一个接口来描述我们的API:
```kotlin
interface ApiService {
@GET("api/get_data")
suspend fun getData(): Response<List<String>>
}
```
注意,我们在这里使用了 `suspend` 关键字来表示这个方法是一个挂起函数。
接下来,我们创建一个 `ApiService` 的实例:
```kotlin
val retrofit = Retrofit.Builder()
.baseUrl("https://example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val api = retrofit.create(ApiService::class.java)
```
现在,我们可以在我们的 ViewModel 中使用这个 `api` 对象来进行网络请求了:
```kotlin
class MyViewModel : ViewModel() {
private val _data = MutableLiveData<List<String>>()
val data: LiveData<List<String>> = _data
fun loadData() {
viewModelScope.launch {
val response = api.getData()
if (response.code == 200) {
_data.value = response.data
}
}
}
}
```
在这里,我们使用了 `viewModelScope` 来启动一个协程来进行网络请求。如果请求成功,我们就将数据传递给 `_data` 变量,它是一个 LiveData 对象。
最后,我们可以在我们的 Activity 或 Fragment 中观察 `data` 变量来获取网络请求返回的数据:
```kotlin
class MyActivity : AppCompatActivity() {
private val viewModel by viewModels<MyViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my)
viewModel.data.observe(this, Observer { data ->
// 在这里更新UI
})
viewModel.loadData()
}
}
```
这样,我们就使用 Kotlin + 协程 + Retrofit + MVVM 实现了一个优雅的网络请求。
阅读全文