Методы Retrofit2 onResponse и onFailure не вызываются - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь изучить разбиение на страницы, реализуя Сеть подкачки + базу данных Google Codelab Example . Однако MindOrks показывает пошаговый процесс. Но я получаю сообщение об ошибке. Я следую шагам MindOrks , потому что они явно использовали PagedList.BoundaryCallback . Таким образом, между кодами есть небольшое изменение, но результат остается прежним. В реализации MindOrks забыли добавить .setBoundaryCallback(boundaryCallback), которое необходимо для вызова class BoundaryCondition. Проблема в том, что методы onResponse и onFailure не вызываются. Когда я смотрю на logcat, соединение в порядке.

private const val TAG = "GithubService"
private const val IN_QUALIFIER = "in:name,description"

fun searchRepos(
    service: GithubService,
    query: String,
    page: Int,
    itemsPerPage: Int,
    onSuccess: (repos: List<Repo>) -> Unit,
    onError: (error: String) -> Unit
) {
    Log.d(MY_TAG, "query: $query, page: $page, itemsPerPage: $itemsPerPage")

    val apiQuery = query + IN_QUALIFIER

    service.searchRepos(apiQuery, page, itemsPerPage).enqueue(
        object : Callback<RepoSearchResponse> {
            override fun onFailure(call: Call<RepoSearchResponse>?, t: Throwable) {
                t.printStackTrace()
                Log.d(MY_TAG, "fail to get data")
                onError(t.message ?: "unknown error")
            }

            override fun onResponse(
                call: Call<RepoSearchResponse>?,
                response: Response<RepoSearchResponse>
            ) {
                Log.d(MY_TAG, "got a response $response")
                if (response.isSuccessful) {
                    Log.d(MY_TAG, "Github Service: Got Response")
                    val repos = response.body()?.items ?: emptyList()
                    Log.d(MY_TAG, "Github Service: Got Repos")
                    onSuccess(repos)
                } else {
                    Log.d(MY_TAG, "Github Service: unknown Error")
                    onError(response.errorBody()?.string() ?: "Unknown error")
                }
            }

        }
    )
}

interface GithubService {

    @GET("search/repositories?sort=stars")
    fun searchRepos(
        @Query("q") query: String,
        @Query("page") page: Int,
        @Query("per_page") itemsPerPage: Int
    ): Call<RepoSearchResponse>

    companion object {
        private const val BASE_URL = "https://api.github.com/"

        fun create(): GithubService {
            val logger = HttpLoggingInterceptor()
            logger.level = Level.BASIC

            val client = OkHttpClient.Builder()
                .addInterceptor(logger)
                .build()

            return Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(GithubService::class.java)
        }
    }
}

Даже Log.d(MY_TAG, "query: $query, page: $page, itemsPerPage: $itemsPerPage") этот код выполняется.

2020-05-25 19:43:21.702 1333-1369/com.example.pagingpractice I/okhttp.OkHttpClient: --> GET https://api.github.com/search/repositories?sort=stars&q=Androidin%3Aname%2Cdescription&page=1&per_page=50
2020-05-25 19:43:21.897 1333-1365/com.example.pagingpractice D/vndksupport: Loading /vendor/lib64/hw/android.hardware.graphics.mapper@2.0-impl.so from current namespace instead of sphal namespace.
2020-05-25 19:43:21.898 1333-1365/com.example.pagingpractice D/vndksupport: Loading /vendor/lib64/hw/gralloc.msm8953.so from current namespace instead of sphal namespace.
2020-05-25 19:43:24.080 1333-1369/com.example.pagingpractice I/okhttp.OkHttpClient: <-- 200 OK https://api.github.com/search/repositories?sort=stars&q=Androidin%3Aname%2Cdescription&page=1&per_page=50 (2377ms, unknown-length body)
2020-05-25 19:43:24.314 1333-1369/com.example.pagingpractice E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
    Process: com.example.pagingpractice , PID: 1333
    java.lang.BootstrapMethodError: Exception from call site #1 bootstrap method
        at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.onResponse(DefaultCallAdapterFactory.java:82)
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:161)
        at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:504)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.ClassCastException: Bootstrap method returned null
        at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.onResponse(DefaultCallAdapterFactory.java:82) 
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:161) 
        at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:504) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:764) 
2020-05-25 19:43:24.351 1333-1369/com.example.pagingpractice 
...