从挂起功能更新 Recyclerview 适配器

Updating Recyclerview adapter from suspend function

我正在尝试加载和显示图书 api 中的图书,但没有显示信息。如果我使用调试器并单步执行但不是从一开始就可以显示它。

    val client = OkHttpClient()
    val request = Request.Builder()
        .url(url)
        .build()

    client.run {
        newCall(request).enqueue(object : Callback {
            override fun onFailure(call: okhttp3.Call, e: IOException) {
                e.printStackTrace()
            }

            override fun onResponse(call: okhttp3.Call, response: Response) {
                if (!response.isSuccessful) {
                    System.err.println("Response unsuccessful")
                    return
                }
                val response = response.body?.string()
                val books = response?.let { parse(it) }
                if (books != null) {
                    list.addAll(books.bookItems)
                }
            }
        })
        delay(500)
    }
    return list
}

编辑:只需要增加延迟时间并删除 renderBooks() 调用

您在片段的视图初始化之前调用 presenter.getBooks。试着把它放在 onViewCreated.

里面

那个延迟似乎很不对。 您正在使所有数据请求花费 500 毫秒。如果花费的时间更长,您将得不到数据,如果花费的时间更少,那么您就没有必要等待。

我假设这在使用调试器时有效,因为你让函数在 return 语句之前等待更长时间。

正确的解决方法是使用suspendCoroutine.

return suspendCoroutine { cont ->
   val client = OkHttpClient()
   val request = Request.Builder()
       .url(url)
       .build()

   client.run {
       newCall(request).enqueue(object : Callback {
           override fun onFailure(call: okhttp3.Call, e: IOException) {
              cont.resumeWithException(e)
           }

           override fun onResponse(call: okhttp3.Call, response: Response) {
               if (!response.isSuccessful) {
                   System.err.println("Response unsuccessful")
                   cont.resume(emptyList())
               }
               val items = response.body?.string()
                        ?.let { parse(it) }
                        ?.bookItems
                        .orEmpty()
               cont.resume(items)
           }
       })
    }
}

您可能需要将对字符串的调用包装在 try catch 中以捕获读取输入字符串时出现的任何 IOException。