我试图在Kotlin中读取一个带有retrofit2的API,但是我不明白为什么它会返回一个错误。如果能帮助我理解问题所在,我将不胜感激。谢谢。
ApiResponse.kt ...
package app.macgo.api.models
data class ApiResponse(
val bpi: Bpi,
val chartName: String,
val disclaimer: String,
val time: Time
)
data class Bpi(
val EUR: EUR,
val GBP: GBP,
val USD: USD
)
data class Time(
val updated: String,
val updatedISO: String,
val updateduk: String
)
data class EUR(
val code: String,
val description: String,
val rate: String,
val rate_float: Double,
val symbol: String
)
data class GBP(
val code: String,
val description: String,
val rate: String,
val rate_float: Double,
val symbol: String
)
data class USD(
val code: String,
val description: String,
val rate: String,
val rate_float: Double,
val symbol: String
)..。
ApiService
..。
package app.macgo.api.models
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Url
interface ApiService {
@GET
fun getPricesByData(@Url url:String):Response<ApiResponse>
}..。
MainActivity
..。
package app.macgo.api
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import app.macgo.api.databinding.ActivityMainBinding
import app.macgo.api.models.ApiResponse
import app.macgo.api.models.ApiService
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val btn = findViewById<TextView>(R.id.btn)
btn.setOnClickListener{
callPrice()
}
}
//
private fun getRetrofit():Retrofit{
return Retrofit.Builder()
.baseUrl("https://api.coindesk.com/v1/bpi/")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
//
private fun callPrice(){
CoroutineScope(Dispatchers.IO).launch {
val call:Response<ApiResponse> = getRetrofit().create(ApiService::class.java).getPricesByData("scurrentprice.json")
val resultado: ApiResponse? = call.body()
if (call.isSuccessful){
println("RESULTADO: $resultado")
}
}
}
}..。
错误:
E/AndroidRuntime:致命异常:DefaultDispatcher-worker进程: app.macgo.api,PID: 11571 java.lang.IllegalArgumentException:无法为位于retrofit2.HttpServiceMethod.createCallAdapter(HttpServiceMethod.java:116) at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:67) at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:39) at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:202) at retrofit2.Retrofit$1.invoke(Retrofit.java:160) at java.lang.reflect.Proxy.invoke的方法ApiService.getPricesByData at retrofit2.Utils.methodError(Utils.java:54)创建retrofit2.Response调用适配器(app.macgo.api.MainActivity$callPrice$1.invokeSuspend(MainActivity.kt:38) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678) at kotlinx.coroutines的Proxy.java:1006) $Proxy1.getPricesByData(未知来源).scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)原因: retrofit2.Response.的java.lang.IllegalArgumentException:找不到调用适配器已尝试:* retrofit2.DefaultCallAdapterFactory 2.CompletableFutureCallAdapterFactory*Retrofit2.DefaultCallAdapterFactory at retrofit2.Retrofit.callAdapter(Retrofit.java:237) at retrofit2.HttpServiceMethod.createCallAdapter(HttpServiceMethod.java:114) ... 13更多
发布于 2021-02-25 21:29:58
在普通的翻新界面中,使用Call而不是Response作为包装类型。
也就是说,改变
fun getPricesByData(@Url url:String):Response<ApiResponse>至
fun getPricesByData(@Url url:String):Call<ApiResponse>https://stackoverflow.com/questions/66369334
复制相似问题