java.lang.IllegalArgumentException: методы службы не могут возвращать void - PullRequest
0 голосов
/ 22 ноября 2018

Я пишу на 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 и в executeCall () MyApiService.Если я закомментирую строку и использую ее вместо того, что у меня есть сейчас, я получу «java.lang.IllegalArgumentException: методы службы не могут возвращать void.», И я не уверен, почему.Что я делаю не так?

1 Ответ

0 голосов
/ 22 ноября 2018

executeCall не должно быть методом MyAPIService.Модификация пытается обработать это вместе с другими методами и не может, потому что, как говорится в сообщении об ошибке "Методы службы не могут возвращать void" .Поэтому он не может создать службу и выдает исключение.Без этой строки myApiService никогда не создается.

Интерфейс, передаваемый в Retrofit, должен быть просто интерфейсом (без реализаций) и содержать только методы запроса, помеченные @GET / @POST / etc.

Просто поместите его где-нибудь еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...