RxJava/Retrofit/RxAndroid 滞后
RxJava/Retrofit/RxAndroid Lag
我在 activity/fragment 的 onResume
方法中进行网络调用时遇到明显的延迟。例如,当我完成一个 activity,而前一个 activity 在其 onResume
中有一个网络调用时,应用程序在发出网络请求时挂起 3-4 秒,并且 UI 更新然后终于完成转换回来。
我的许多屏幕都需要在重新访问页面时加载数据。例如,我有一个订单列表和一个 create/update 订单的子页面。返回订单列表时,我需要更新列表。
为了实现这一点,我正在做以下事情
override fun onResume() {
super.onResume()
fetchOrders()
}
fun fetchOrders() {
Observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())?.map {
//DO COMPUTATION AND UPDATE UI HERE
}.subscribe()
}
我假设是因为我在 AndroidSchedulers.mainThread
上更新 UI 我遇到了延迟。我想知道我是否做错了什么,我可以做些什么来提高它的性能。我尝试过更改线程,但是我需要在主线程上进行,因为这是进行 UI 更新的唯一位置。
如果您的计算量很大,则可能是这样。将它们制作在 Schedulers.computation()
:
中可能会更好
observable
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.map {
// do computations
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
// update ui
}
根据您的代码,计算和更新 UI 操作似乎在 main thread
中进行。您在 map
的任务很重,而在 main thread
的任务是 运行,因为 observeOn
改变了下游,而 subscribeOn
改变了上游和下游。在您的情况下,map
应该在 computation
或 io
线程上执行。看起来像:
fetchDataObserveable()
.subscribeOn(Schedulers.io())
.map {
// do computations
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
// update ui
}
我在 activity/fragment 的 onResume
方法中进行网络调用时遇到明显的延迟。例如,当我完成一个 activity,而前一个 activity 在其 onResume
中有一个网络调用时,应用程序在发出网络请求时挂起 3-4 秒,并且 UI 更新然后终于完成转换回来。
我的许多屏幕都需要在重新访问页面时加载数据。例如,我有一个订单列表和一个 create/update 订单的子页面。返回订单列表时,我需要更新列表。
为了实现这一点,我正在做以下事情
override fun onResume() {
super.onResume()
fetchOrders()
}
fun fetchOrders() {
Observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())?.map {
//DO COMPUTATION AND UPDATE UI HERE
}.subscribe()
}
我假设是因为我在 AndroidSchedulers.mainThread
上更新 UI 我遇到了延迟。我想知道我是否做错了什么,我可以做些什么来提高它的性能。我尝试过更改线程,但是我需要在主线程上进行,因为这是进行 UI 更新的唯一位置。
如果您的计算量很大,则可能是这样。将它们制作在 Schedulers.computation()
:
observable
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.map {
// do computations
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
// update ui
}
根据您的代码,计算和更新 UI 操作似乎在 main thread
中进行。您在 map
的任务很重,而在 main thread
的任务是 运行,因为 observeOn
改变了下游,而 subscribeOn
改变了上游和下游。在您的情况下,map
应该在 computation
或 io
线程上执行。看起来像:
fetchDataObserveable()
.subscribeOn(Schedulers.io())
.map {
// do computations
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
// update ui
}