后台线程被阻止时服务未收到Intent

时间:2017-07-07 01:13:01

标签: java android multithreading android-intent

我有两个Android应用程序通过意图相互通信。我们称之为 A B (不是他们的真实姓名)。在正常情况下,我们有以下内容:

  • A 的后台帖子会将意图发送到 B
  • A 的后台主题使用Object.wait阻止,超时时间为30秒。
  • B 使用Context.startService将意图发送到 A
  • A 在主线程上的Service.onStartCommand中接收Intent。
  • A 可以从后台线程可以访问的意图中保存信息。
  • 从主线程中, A 调用Object.notifyAll来释放后台线程。
  • A 中的后台主题处理结果。

这项工作多年来一直运作良好,并且遇到特定客户,它在300台设备中占98%。

现在的问题是这个过程在少数设备上失败了。 B A 的意图被延迟,而 A 中的后台线程被阻止。一旦后台线程不再被阻止(它有30秒超时),主线程上的 A 会立即收到意图,即使主线程从未被阻止。所以我们有:

  • A 的后台帖子会将意图发送到 B
  • A 的后台主题使用Object.wait阻止,超时时间为30秒。
  • B 使用Context.startService将意图发送到 A
  • A 的后台主题超时,不再关心Intent。
  • A 在主线程上的Service.onStartCommand中接收Intent。
  • A 中的意图被丢弃,因为没有任何东西在等待它了。
  • A 的后台主题会重试,无限期地再次启动该过程。

应用 B 似乎不是问题所在。它在不到一秒的时间内完成了应有的一切。我已确认 A 中的主要帖子未被屏蔽。 UI始终保持响应,我尝试在此过程中定期在主线程上运行代码,以确认它应该准备好接收Intent。此问题仅在过去几周内开始,并且没有更改代码。我不知道设备上运行的其他应用程序有任何变化,但我认为它们不应该导致此问题。我不知道操作系统有任何更新,但它们似乎都运行相同的版本。因此,如果这是一个错误,我希望在所有设备上看到它,而不仅仅是少数。根据客户的报告,经过一段时间的延长,以及此代码的多次重试,它将突然发挥作用。但是再次尝试这个过程,它会再次卡住。

我希望有人见过这样的事情和/或可能会提出这种行为的可能原因。我倾向于认为它在设备上是环保的,但我不知道是什么原因造成的。我完全坚持这一点,而且我目前正致力于一种解决方法,我可以随意改变这个过程的工作方式,以达到相同的效果,只是希望问题能够神奇地消失。

0 个答案:

没有答案