用例:
当地理围栏触发时,我们需要尽快联系服务器。我们已经通过隐式的BroadcastReceiver调用了服务来解决了这一问题,但是由于Doze和Oreo的背景限制,在新版本中存在问题。
尝试的修补程序:
我们将地理围栏注册从隐式->显式广播接收器移开,以避开“背景模式”限制。
我们尝试按照Google的示例进行操作,即广播接收方在 JobIntentService 上调用 enqueueWork()。问题在于,我们经常注意到在计划作业时间与实际运行时间之间存在较长的“滞后”。我们的记录超过一个小时!
因此,我们改为尝试将所有功能移到BroadcastReceiver中,并使用 goAsync()进行网络通话。 (如果尝试同步执行网络操作,则会收到“主线程无网络”异常)。
在可以启动线程并执行代码的范围内工作,但是网络操作给我们带来麻烦。
问题:
因此,由于上述问题,我们的当前解决方案是一个显式的BroadcastReceiver,它使用 goAsync()进行服务器调用。
但是,网络呼叫间歇性地工作。我们经常收到“ java.net.SocketException:套接字已关闭”错误。这不是服务器问题,当从我们的“常规”应用程序代码中调用时,它始终有效。
我不确定为什么会这样,但是我怀疑打ze模式吗?虽然,我不确定在地理围栏触发器实际调用Receiver时如何获得该信息。
问题:
有人从我们的goAsync()中知道为什么网络操作会失败吗?同样,该线程有效,只是我们在实际的网络操作中收到套接字错误。
在Android的较新版本中,除了我们已经尝试过的事情之外,是否还有其他方法可以通过地理围栏触发器直接进行网络通话?
< / li>指针和思想深表感谢!