【发布时间】:2021-11-08 12:55:03
【问题描述】:
我正在处理的应用程序正在以非常高的速率(每 100 毫秒)接收数据。数据由后台线程接收,我需要将其显示在 Activity 上。
我正在使用处理程序将数据从后台线程发布到主线程。但一段时间后,我们开始看到延迟。
延迟
后台线程以 100 毫秒的间隔接收数据并将数据发送到处理程序。但是主线程循环器忙于等待 FrameHandler 完成它的工作。因此,我的消息被延迟处理。而且这种延迟不断增加。
以下是looper日志:
com.example.app.MainActivity$4 - 是我应用的自定义处理程序
android.view.Choreographer$FrameHandler - 操作系统帧处理程序
09-08 14:52:02.465 15397 15397 D MAIN_LOOPER: >>>> 调度到处理程序 (com.example.app.MainActivity$4) {3b4862a} null: 102
09-08 14:52:02.467 15397 15397 D MAIN_LOOPER:
我的应用需要 2 毫秒来处理数据
09-08 14:52:02.467 15397 15397 D MAIN_LOOPER: >>>>> 调度到处理程序 (android.view.Choreographer$FrameHandler) {6eab416} android.view.Choreographer$FrameDisplayEventReceiver@3d19197: 0
09-08 14:52:06.080 15397 15397 D MAIN_LOOPER:
FrameHandler 用了 4 秒完成处理。
09-08 14:52:06.080 15397 15397 D MAIN_LOOPER: >>>> 调度到 Handler (com.example.app.MainActivity$4) {3b4862a} null: 102
09-08 14:52:06.083 15397 15397 D MAIN_LOOPER:
我们如何减少帧处理程序或任何替代方法将数据从后台线程发布到主线程所花费的时间?
【问题讨论】:
-
你使用什么 API 来做 bg 工作?是服务还是线程还是workManager?
-
这是一项服务。服务在后台线程上下文中从其他源接收一些数据。
-
您是否尝试过使用允许 MVVM 模式的android architecture components,您可以在后台线程上工作并将更改发布到一组LiveData,任何观察者都会收到更改通知?
-
我也试过这个,行为是一样的。
标签: java android handler android-looper