首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Retrofit2 whit

Retrofit2 whit
EN

Stack Overflow用户
提问于 2021-02-25 21:21:19
回答 1查看 123关注 0票数 0

我试图在Kotlin中读取一个带有retrofit2的API,但是我不明白为什么它会返回一个错误。如果能帮助我理解问题所在,我将不胜感激。谢谢。

ApiResponse.kt ...

代码语言:javascript
复制
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

..。

代码语言:javascript
复制
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

..。

代码语言:javascript
复制
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更多

EN

回答 1

Stack Overflow用户

发布于 2021-02-25 21:29:58

在普通的翻新界面中,使用Call而不是Response作为包装类型。

也就是说,改变

代码语言:javascript
复制
fun getPricesByData(@Url url:String):Response<ApiResponse>

代码语言:javascript
复制
fun getPricesByData(@Url url:String):Call<ApiResponse>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66369334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档