kotlin 无法为类java.lang.Object创建调用适配器- Retrofit

9bfwbjaz  于 2022-11-16  发布在  Kotlin
关注(0)|答案(4)|浏览(142)

我正在学习使用改型进行API调用,但每当我试图从API发出获取请求时,我的应用程序崩溃并给出以下错误。
异常错误:无法为方法WeatherApi的java.lang.Object类创建调用适配器。getweatherbycity
错误原因:java.lang.非法参数异常:找不到类java. lang. Object的调用适配器。已尝试:2007年12月28日,在北京,一个叫“中国制造”的公司,在一个叫“中国制造”的公司,在一个叫“中国制造”的公司,在一个叫“中国制造”的公司,在一个叫“中国制造”的公司,在一个叫“中国制造”的公司,在一个叫“中国制造”的公司,在一个叫“中国制造”的公司。
我尝试了许多解决方案,从stackoverflow,但没有工作,我也是新的mvvm和viewmodels的东西。
类改造示例{

companion object{

    private val retrofit by lazy{
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build()
    }

    val api by lazy{
        retrofit.create(WeatherApi::class.java)
    }

}

}
接口WeatherApi {

@GET("data/2.5/weather")
suspend fun getweatherbycity(
    @Query("q")
    cityname: String="London",
    @Query("appid")
    api_key: String = API_KEY
): Response<WeatherResponse>

}
我已经创建了天气响应类使用Json到Kotlin转换器插件在Android工作室

data class WeatherResponse(
    val base: String,
    val clouds: Clouds,
    val cod: Int,
    val coord: Coord,
    val dt: Int,
    val id: Int,
    val main: Main,
    val name: String,
    val sys: Sys,
    val timezone: Int,
    val visibility: Int,
    val weather: List<Weather>,
    val wind: Wind
)

class WeatherRepository{

    suspend fun getweatherbycityname(cityname:String)=RetrofitInstance.api.getweatherbycity(cityname)

}

class WeatherViewModel(
    val weather_rep: WeatherRepository
):ViewModel() {

    val current_weather:MutableLiveData<Response<WeatherResponse>> = MutableLiveData()

    fun getweatherbycity(city:String="London")= viewModelScope.launch {

        val weather=weather_rep.getweatherbycityname(city)
            //current_weather.postValue(weather)

    }

}

相依性-

implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
m528fe3b

m528fe3b1#

在我的例子中,我在API接口方法中使用了suspend,但问题是我使用的是Retrofit2 2.3.0,而我应该使用Retrofit2 2.6或更高版本,因为根据this,在那个版本中他们添加了对Coroutines的官方支持。
我的API:

interface CoolApi {
    @POST("/api/v1/path")
    @Headers("@: Noauth")
    suspend fun coolApiCall(@Body request: coolRequest): Response<CoolResponse>?
}

改造生成器:

val api = Retrofit.Builder()
                .baseUrl(BuildConfig.BASE_URL)
                .client(createOkHttpClient())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(CoolApi::class.java)

然后我像这样启动协程:

lifecycleScope.launch(Dispatchers.IO) {
    try {
        val response = apiMethod(api)

        if (response!!.isSuccessful) {
            callback.onSuccess(response.code(), response.body())

        } else {
            // Error handling
        }
    } catch (e: Exception) {
        when (e) {
            // Exception handling
        }
    }
}

注意为了使用lifecycleScope,你需要添加一些依赖项。在我的gradel.build (:app)中,我有:

// For lifecycle-aware coroutines
    def lifecycle_version = "2.3.1"
    // Lifecycles only (without ViewModel or LiveData)
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

    implementation "org.jetbrains.kotlin:kotlin-reflect:1.5.31"

然后你可以从Activity或Fragment中使用lifecycleScope。如果你在另一个文件中启动协程(我的例子就是这样),你可以把它作为一个参数传递。

5f0d552i

5f0d552i2#

您在此处得到的响应是错误的:

@GET("data/2.5/weather")
suspend fun getweatherbycity(
    @Query("q")
    cityname: String="London",
    @Query("appid")
    api_key: String = API_KEY
): Response<WeatherResponse>

因为您使用的是RxJavaCallAdapterFactory,请返回observeable以获得响应

@GET("data/2.5/weather")
suspend fun getweatherbycity(
    @Query("q")
    cityname: String="London",
    @Query("appid")
    api_key: String = API_KEY
): Single<Response<WeatherResponse>>
bogh5gae

bogh5gae3#

接口WeatherAp将其公开

cvxl0en2

cvxl0en24#

它的发生同样的事情对我来说,我只是更新了改造版本从build.gradle和工程。尝试更新改造版本。

相关问题