在我的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
答案 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()