android - java.lang.IllegalArgumentException:服务方法不能返回 void
问题描述
我正在使用 Kotlin 编写并尝试将 Retrofit2 合并到我的代码中,使用此调用:https ://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=Hello
这是我的界面:
interface MyApiService {
companion object {
val myApiService by lazy {
RealiApiService.create()
}
private fun create(): MyApiService {
val retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://en.wikipedia.org/w/")
.build()
return retrofit.create(RealiApiService::class.java)
}
}
fun executeCall(call: Call<Any>) {
call.enqueue(object : Callback<Any> {
override fun onResponse(call: Call<Any>, response: Response<Any>) {
Log.d("response is ${response.body()}")
}
override fun onFailure(call: Call<Any>, t: Throwable) {
Log.d("Throwable is $t")
}
})
}
@GET("api.php")
fun searchArtist(@Query("action") action: String,
@Query("format") format: String,
@Query("list") list: String,
@Query("srsearch") srsearch: String):
Call<Any>
}
这是我的 MainActivity:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
beginSearch("Hello")
}
private fun beginSearch(srsearch: String) {
val call = realiApiService.searchArtist("query", "json", "search", srsearch)
call.enqueue(object : Callback<Any> {
override fun onResponse(call: Call<Any>, response: Response<Any>) {
Log.d("response is ${response.body()}")
}
override fun onFailure(call: Call<Any>, t: Throwable) {
Log.d("Throwable is $t")
}
})
//myApiService.executeCall(call)
}
}
上面的代码完美运行。但是请注意,我在 beginSearch 和 MyApiService 的 executeCall() 中有完全相同的代码。如果我注释掉该行并使用它而不是我现在拥有的,我会得到“java.lang.IllegalArgumentException:服务方法不能返回 void。”,我不知道为什么。我究竟做错了什么?
解决方案
executeCall
不应该是MyAPIService
. Retrofit 尝试与其他方法一起处理它并且不能,因为错误消息说"Service methods cannot return void"。所以它不能创建服务并抛出异常。没有那条线,myApiService
就永远不会被创造出来。
传递给Retrofit的接口应该只是一个接口(没有实现),并且只包含用@GET
/ @POST
/etc注解的请求方法。
基本上把它放在其他任何地方。
推荐阅读
- variables - 如何动态加载 var 文件并使用 ansible 将它们组合成一个变量
- angularjs - ui-scroll:滚动时禁用更新/获取
- c++ - 前向声明或继承 std::type_index
- python-3.x - 添加具有其他列名称作为变量的列
- agile - ROI(商业价值)的故事映射和用户故事优先级
- c# - 为什么dotnet在ubuntu上构建会输出一个dll文件?
- c++ - 我可以根据私有/受保护成员分配类枚举吗?
- django - 如何在多对多字段中隐藏 Django Admin 的一些用户组
- python - BiqQuery 存储。Python。并行读取多个流(多处理)
- nock - Nock - how to log the status of each request?