当前位置: 首页 > 知识库问答 >
问题:

无法为类java创建调用适配器。lang.对象-改装

蓬森
2023-03-14

我正在学习使用改型进行api调用,但每当我试图从api发出get请求时,我的应用程序就会崩溃,并出现以下错误。。

Java语言lang.IllegalArgumentException:无法为类java创建调用适配器。方法WeatherApi的lang.对象。getweatherbycity

原因:java。lang.IllegalArgumentException:找不到类java的调用适配器。lang.Object。已尝试:*改装2。适配器。rxjava。RxJavaCallAdapterFactory*改装2。改装2处的ExecutorCallAdapterFactory。改装。NextCalAdapter(Reformation.java:237)位于Reform2。改装。Reform2上的callAdapter(Reformation.java:201)。ServiceMethod$生成器。createCallAdapter(ServiceMethod.java:232)。。。29个以上

我尝试了stackoverflow的许多解决方案,但都不起作用,我也是mvvm和视图模型的新手。

类改型实例{

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>

}

我在android studio中使用Json到kotlin转换器插件创建了天气响应类

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'

共有3个答案

朱俊雅
2023-03-14

您在此处得到的响应不正确:

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

因为您使用的是RxJavaCallAdapterFactory,请返回可观察的响应

@GET("data/2.5/weather")
suspend fun getweatherbycity(
    @Query("q")
    cityname: String="London",
    @Query("appid")
    api_key: String = API_KEY
): Single<Response<WeatherResponse>>
仲孙默
2023-03-14

接口WeatherAp公开

闻修筠
2023-03-14

在我的例子中,我在我的API接口方法中使用了暂停,但是问题是我使用的是Retrofit2 2.3.0,而我应该使用Retrofit2 2.6或更高版本,因为根据这一点,在那个版本中他们添加了对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,您需要添加一些依赖项。在我的等级中。生成(: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"

然后您可以从活动或片段中使用lifesycleScope。如果您在另一个文件中启动协程(这是我的情况),您可以将其作为参数传递。

 类似资料:
  • 问题内容: 我正在使用SimpleXml改造2.0.0-beta1。我想从REST服务中检索简单(XML)资源。使用SimpleXML编组/解组Simple对象可以正常工作。 使用此代码(转换为2.0.0之前的代码)时: 服务: 我得到这个异常: 我想念什么?我知道用作品包装返回类型。但是我希望服务将业务对象作为类型返回(并在同步模式下工作)。 更新 添加了额外的依赖关系并根据不同的答案提出建议后

  • 但每次我都收到异常:创建@body转换器 我怎么送?或者其他我能做到的想法。您甚至可以向我提供包含json的简单参数。这对我很合适

  • 错误:java.lang.IllegalArgumentException:无法为apiInterface.postimage方法的rx.Observable创建调用适配器 UPD: 我将接口和其他更改为: 在那之后,我有一个错误(这是不是意味着,我是对的??): 错误:Android.os.NetworkOnMainThreadException UPD3: *E/AndroidRuntime:

  • 我在使用ActiveAndroid对API调用和数据库进行修改。在Pre6.0的Android设备上,一个应用程序可以很好地工作。无法确定根本原因。 改装2 Beta-4。Android6。无法创建转换器 我不明白为什么要使用gson或gsonbuilder? 感谢任何帮助。

  • 适配器目录和文件结构 适配器目录和文件结构布局的例子: /application/libraries/Driver_name Driver_name.php drivers Driver_name_subclass_1.php Driver_name_subclass_2.php Driver_name_subclass_3.php 注意: 为了在大小写敏感的文件系统上维持兼容性,这个 Drive

  • 我一直在开发一个java应用程序,我遇到了一个无法找到答案的问题。我的应用程序是一个postgresql学生数据库,应用程序是在maven中使用MCV模式制作的,对于web部件,我使用Spring和hibernate,因为IDE使用Intellij。 我可以毫无问题地启动它,但在访问localhost页面时,我会出现以下错误: 出现意外错误(类型=内部服务器错误,状态=500)。无法提取结果集;S