发送和接收意图之间的巨大延迟
Huge delay between sending and receiving an intent
编辑:
我在这里解释的问题与意图无关。
相反,使用我选择的方法旋转位图需要 300 毫秒。
现在我找到了在10-15ms内旋转的方法,所以问题解决了。
我的问题的一些背景信息:
- 我有一个罗盘小部件和一个服务,当我按下小部件上的按钮时,它就会启动。
- 此服务要求 android 提供 GPS 和传感器数据,并在几分钟内通过 intent 将它们发送到小部件。
- AppWidgetProvider 然后旋转罗盘针并做其他事情。
现在问题:
- 当我按下该按钮时,服务会立即开始发送意图,并且小部件会延迟一两秒处理传入的数据。
服务运行一段时间后,慢慢恢复正常,我觉得有点奇怪...
我认为最好将日志的两个部分并排发布:
WidgetIntentService: onCreate() called.
WidgetIntentService: Service onStartCommand
WidgetIntentService: The service has started.
WidgetIntentService: Updates started.
WidgetIntentService: onDestroy() called.
WidgetIntentService: Heading: 330.0 degrees
WidgetIntentService: Heading: 338.0 degrees
WidgetIntentService: Heading: 342.0 degrees
WidgetIntentService: Heading: 340.0 degrees
WidgetIntentService: Heading: 334.0 degrees
WidgetIntentService: Heading: 329.0 degrees
WidgetIntentService: Heading: 331.0 degrees
WidgetProvider1: Rotation: 330.0
WidgetIntentService: Heading: 330.0 degrees
WidgetProvider1: Rotation: 338.0
WidgetIntentService: Heading: 327.0 degrees
WidgetProvider1: Rotation: 342.0
WidgetIntentService: Heading: 326.0 degrees
WidgetProvider1: Rotation: 340.0
WidgetIntentService: Heading: 322.0 degrees
WidgetProvider1: Rotation: 334.0
WidgetIntentService: Heading: 316.0 degrees
...
WidgetIntentService: Heading: 334.0 degrees
WidgetProvider1: Rotation: 334.0
WidgetIntentService: Heading: 335.0 degrees
WidgetProvider1: Rotation: 335.0
WidgetIntentService: Heading: 335.0 degrees
WidgetProvider1: Rotation: 335.0
WidgetIntentService: Heading: 336.0 degrees
WidgetProvider1: Rotation: 336.0
有时,直到我第二次启动服务时,这种延迟才会消失。
在这种情况下,日志是这样的:
...
WidgetIntentService: GPS stopped.
WidgetIntentService: Magnetometer stopped.
WidgetProvider1: Rotation: 293.0
WidgetProvider1: Rotation: 293.0
WidgetProvider1: Rotation: 294.0
WidgetProvider1: Rotation: 296.0
WidgetProvider1: Rotation: 299.0
我的理论是,android 缓冲了意图,并且所有这些意图一次一个地处理,直到小部件设法跟上。
有什么方法可以让我的 AppWidgetProvider 只接受最后收到的意图而忽略所有其他意图?
如果您对我如何以更好的方式做到这一点有任何想法,请告诉我!
这就是 IntentService 所做的 - 它对请求进行排队并在单个非 UI 线程上一次处理一个请求。如果您不想要这种行为,请不要使用 IntentService。使用服务并自行处理任何线程。
编辑:
我在这里解释的问题与意图无关。 相反,使用我选择的方法旋转位图需要 300 毫秒。 现在我找到了在10-15ms内旋转的方法,所以问题解决了。
我的问题的一些背景信息:
- 我有一个罗盘小部件和一个服务,当我按下小部件上的按钮时,它就会启动。
- 此服务要求 android 提供 GPS 和传感器数据,并在几分钟内通过 intent 将它们发送到小部件。
- AppWidgetProvider 然后旋转罗盘针并做其他事情。
现在问题:
- 当我按下该按钮时,服务会立即开始发送意图,并且小部件会延迟一两秒处理传入的数据。
服务运行一段时间后,慢慢恢复正常,我觉得有点奇怪...
我认为最好将日志的两个部分并排发布:
WidgetIntentService: onCreate() called. WidgetIntentService: Service onStartCommand WidgetIntentService: The service has started. WidgetIntentService: Updates started. WidgetIntentService: onDestroy() called. WidgetIntentService: Heading: 330.0 degrees WidgetIntentService: Heading: 338.0 degrees WidgetIntentService: Heading: 342.0 degrees WidgetIntentService: Heading: 340.0 degrees WidgetIntentService: Heading: 334.0 degrees WidgetIntentService: Heading: 329.0 degrees WidgetIntentService: Heading: 331.0 degrees WidgetProvider1: Rotation: 330.0 WidgetIntentService: Heading: 330.0 degrees WidgetProvider1: Rotation: 338.0 WidgetIntentService: Heading: 327.0 degrees WidgetProvider1: Rotation: 342.0 WidgetIntentService: Heading: 326.0 degrees WidgetProvider1: Rotation: 340.0 WidgetIntentService: Heading: 322.0 degrees WidgetProvider1: Rotation: 334.0 WidgetIntentService: Heading: 316.0 degrees ... WidgetIntentService: Heading: 334.0 degrees WidgetProvider1: Rotation: 334.0 WidgetIntentService: Heading: 335.0 degrees WidgetProvider1: Rotation: 335.0 WidgetIntentService: Heading: 335.0 degrees WidgetProvider1: Rotation: 335.0 WidgetIntentService: Heading: 336.0 degrees WidgetProvider1: Rotation: 336.0
有时,直到我第二次启动服务时,这种延迟才会消失。 在这种情况下,日志是这样的:
... WidgetIntentService: GPS stopped. WidgetIntentService: Magnetometer stopped. WidgetProvider1: Rotation: 293.0 WidgetProvider1: Rotation: 293.0 WidgetProvider1: Rotation: 294.0 WidgetProvider1: Rotation: 296.0 WidgetProvider1: Rotation: 299.0
我的理论是,android 缓冲了意图,并且所有这些意图一次一个地处理,直到小部件设法跟上。
有什么方法可以让我的 AppWidgetProvider 只接受最后收到的意图而忽略所有其他意图?
如果您对我如何以更好的方式做到这一点有任何想法,请告诉我!
这就是 IntentService 所做的 - 它对请求进行排队并在单个非 UI 线程上一次处理一个请求。如果您不想要这种行为,请不要使用 IntentService。使用服务并自行处理任何线程。