如何使用Kotlin在Retrofit 2.6.0协程中正确使用暂停乐趣

时间:2019-09-01 06:21:26

标签: kotlin coroutine kotlin-coroutines suspend retrofit2.6

我正在尝试编写网络请求以使用Retrofit 2.6.0,协程会暂停运行。但是我一直在获取空对象。这是我第一次尝试改造2.6和协程

这是我的示例代码

数据类

data class ProjectList (val data: List<Project>)

示例JSON对象

{
    "data": [
        {
            "project_id": "10824",
            "project_name": "Bendor Project",
            "project_number": "P010824",
            "content_items": [
                {
                    "content_id": "235",
                    "content_name": "Longonot Project",
                    "content_description": "Valves Example ",
                    "content_date_updated": "2019-08-31 12:29:00",
                    "project_id": "10824",
                    "media_items": []


网络接口

    suspend fun getProjects(@Query("mode") mode: String): ProjectList

改造客户

class RetrofitClient{


    private val gson = GsonBuilder()
        .setLenient()
        .create()


    private fun retrofit(): Retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()

    val retrofitService: ProjectAPI by lazy {
        retrofit().create(ProjectAPI::class.java)
    }

存储库

class ProjectRepository {

    private val client: ProjectAPI = RetrofitClient().retrofitService

    suspend fun getProjectData(mode : String) : ProjectList = client.getProjects(mode)

}

ViewModel中的实时数据

val request : LiveData<ProjectList> = liveData(Dispatchers.IO){
            val response = repository.getProjectData(SOURCE_MODE)
            Log.e(TAG, "${response.data}")
            emit(response)
        }

我一直得到空响应。我在哪里弄错了?

1 个答案:

答案 0 :(得分:2)

您不需要发出值,只需在协程范围内调用LiveData,然后在ViewModel中创建新的LiveData,最后依次调用liveData.post()即可将网络请求的响应分配给您的<c-b>对象。