【问题标题】:java.lang.IllegalArgumentException: Service methods cannot return voidjava.lang.IllegalArgumentException:服务方法不能返回 void
【发布时间】:2018-11-22 19:33:30
【问题描述】:

我正在使用 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。”,我不知道为什么。我做错了什么?

【问题讨论】:

    标签: android kotlin retrofit2


    【解决方案1】:

    executeCall 不应该是MyAPIService 的方法。改造尝试与其他方法一起处理它并且不能,因为正如错误消息所说"Service methods cannot return void"。所以它不能创建服务并抛出异常。如果没有该行,则永远不会创建 myApiService

    传递给Retrofit的接口应该只是一个接口(没有实现),并且只包含带有@GET/@POST/etc注解的请求方法。

    基本上把它放在其他任何地方。

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 2015-10-03
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多