从挂起功能更新 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。
我正在尝试加载和显示图书 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。