发送和接收意图之间的巨大延迟

Posted

技术标签:

【中文标题】发送和接收意图之间的巨大延迟【英文标题】:Huge delay between sending and receiving an intent 【发布时间】:2017-01-03 14:45:35 【问题描述】:

编辑:

我在这里解释的问题与意图无关。 相反,使用我选择的方法旋转位图需要 300 毫秒。 现在我找到了一种在10-15ms内旋转的方法,问题就解决了。


我的问题的一些背景:

我有一个指南针小部件和一个服务,当我按下小部件上的按钮时,它就会启动。 此服务向 android 询问 GPS 和传感器数据,并在几分钟内通过 Intent 将它们发送到小部件。 AppWidgetProvider 然后旋转指南针并执行其他操作。

现在的问题:

当我按下该按钮时,服务会立即开始发送意图,小部件会延迟一到两秒处理传入的数据。

服务运行一段时间后,它慢慢恢复正常,我觉得有点奇怪......

我认为最好将日志的两个部分并排发布来描述:

WidgetIntentService:onCreate() 被调用。 WidgetIntentService:服务 onStartCommand WidgetIntentService:服务已启动。 WidgetIntentService:更新开始。 WidgetIntentService:调用了 onDestroy()。 WidgetIntentService:航向:330.0 度 WidgetIntentService:航向:338.0 度 WidgetIntentService:航向:342.0 度 WidgetIntentService:航向:340.0 度 WidgetIntentService:航向:334.0 度 WidgetIntentService:航向:329.0 度 WidgetIntentService:航向:331.0 度 WidgetProvider1:旋转:330.0 WidgetIntentService:航向:330.0 度 WidgetProvider1:旋转:338.0 WidgetIntentService:航向:327.0 度 WidgetProvider1:旋转:342.0 WidgetIntentService:航向:326.0 度 WidgetProvider1:旋转:340.0 WidgetIntentService:航向:322.0 度 WidgetProvider1:旋转:334.0 WidgetIntentService:航向:316.0 度 ... WidgetIntentService:航向:334.0 度 WidgetProvider1:旋转:334.0 WidgetIntentService:航向:335.0 度 WidgetProvider1:旋转:335.0 WidgetIntentService:航向:335.0 度 WidgetProvider1:旋转:335.0 WidgetIntentService:航向:336.0 度 WidgetProvider1:旋转:336.0

有时这种延迟直到我第二次启动服务才会消失。 本例中的日志如下所示:

... WidgetIntentService:GPS 停止。 WidgetIntentService:磁力计停止。 WidgetProvider1:旋转:293.0 WidgetProvider1:旋转:293.0 WidgetProvider1:旋转:294.0 WidgetProvider1:旋转:296.0 WidgetProvider1:旋转:299.0

我的理论是,android 会缓冲意图,并且所有这些意图都会一次处理一个,直到小部件设法跟上。

有什么方法可以告诉我的 AppWidgetProvider 只接受收到的最后一个意图并忽略所有其他意图?

如果您知道如何以更好的方式做到这一点,请告诉我!

【问题讨论】:

【参考方案1】:

这就是 IntentService 的作用——它将请求排队并在单个非 UI 线程上一次处理一个。如果您不想要这种行为,请不要使用 IntentService。使用服务并自己处理任何线程。

【讨论】:

我在选择之前阅读了意图服务和普通服务,我决定使用手动创建新线程的普通服务。即使这种行为符合预期,我也不想要它......有什么办法可以解决这个问题吗?

以上是关于发送和接收意图之间的巨大延迟的主要内容,如果未能解决你的问题,请参考以下文章

java 简单的意图数据发送和接收

如何从发送意图接收数据?

未发送执行者对接收者的意图

xamarin蓝牙数据接收延迟

任何 DBMS 都可以发送/接收巨大的矩阵吗?

Android系统是在一个进程中多次向多个接收者发送BOOT_COMPLETED意图还是一次?