无法通过Kotlin执行翻新同步操作

时间:2019-11-09 16:48:53

标签: android kotlin retrofit2.6

在我的android应用中:

app / build.gradle

implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0'
implementation "com.squareup.retrofit2:converter-gson:2.6.0"
implementation "com.squareup.retrofit2:retrofit:2.6.0"

在我的界面中:

import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Query


interface MyRestClient {

    @GET("/event")
    suspend fun getEvents(@Query("orgn") base: Int, @Query("event") quote: Int): Response<List<Event>>
}

我想同步调用此方法。

所以我试试这个:

    import retrofit2.Call
    import retrofit2.Response

    class TransportService {
        companion object {
            private val myRestClient =
                RestClientFactory.createRestClient(MyRestClient ::class.java)

            suspend fun getEventSync(orgn: Int, event: Int): Response<*> {
                val call: Call<*> = myRestClient .getEvents(orgn, event)      
                   return call.execute()
                }

并以此呼叫:

import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

 viewModelScope.launch(Dispatchers.Main) {
            val response = TransportService.getEvents(100, 200)

但是在这一行中我得到了编译错误:

val call: Call<*> = myRestClient.getEvents(orgn, event)   

错误是:

Type mismatch: inferred type is Response<List<Event>> but Call<*> was expected

3 个答案:

答案 0 :(得分:1)

错误消息告诉您问题所在。

Dialog

context返回Dialog,但是您正在尝试将其分配给val call: Call<*> = myRestClient.getEvents(orgn, event)

有了2.6和协同程序,您不再需要致电。

getEvents函数不再有意义。您可以在调用点决定同步还是异步。对于屏蔽:

Response<List<Event>>

答案 1 :(得分:0)

您将在Response界面中返回MyRestClient类型,但是在Call中期望返回TransportService

在您的TransportService类中,将val call的参数类型从Call<*>更改为Response<List<Event>>

此外,由于您要同步执行此方法,因此您可能不需要在suspend方法上使用getEvents修饰符。

答案 2 :(得分:0)

这是我的解决方法:

 viewModelScope.launch(Dispatchers.Main) {
            Debug.d(TAG, "step_1")
            TransportService.getEvents(100, 200)
            Debug.d(TAG, "step_2")
            TransportService.getEvents(300, 400)
            Debug.d(TAG, "step_3")
            TransportService.getEvents(500, 600)
            Debug.d(TAG, "step_4")
        }

在TransportService.kt

suspend fun getEvents(
            orgn: Int,
            event: Int
        ): Response<*> {
            return  waitressCallRestClient.getEvents(orgn, event)
        }

在界面中:

@GET("/event")
    suspend fun getEvents(@Query("orgn") base: Int, @Query("event") quote: Int): Response<List<Event>>

因为我使用了 retrofit 2.6 suspend功能,所以结果 step_2 仅在完成TransportService.getEvents(100, 200)之后打印。 并且 step_2 仅在完成TransportService.getEvents(300, 400)之后打印,依此类推。

这就是我所需要的。我已同步呼叫getEvents()