【问题标题】:Handling JobIntentService and Thread Sleep处理 JobIntentService 和线程休眠
【发布时间】:2018-06-13 06:55:57
【问题描述】:

背景:

最近我不得不将服务迁移到 JobIntentService (JIS) 以支持 Android 8.0 后台服务限制。此服务在 FirebaseInstanceIDService 调用它后将令牌注册到我的服务器。

问题:

我有一个必须通过 JobIntentService (JIS) 进行的网络调用。所有的网络调用操作都是通过 Eventbus (EB) 处理的。

流程如下

JIS -> request API (EB) -> {API Call Handler} -> Send Response (EB) -> JIS -> Handle response. 

您可能已经猜到的问题是,当请求 API 事件被触发时,Intent 服务会自行完成并且不处理响应事件。

临时解决方案:

我以一种肮脏的方式解决这个问题的方法是在触发事件后立即调用 Thread.sleep(400)。(API 大约需要 150 毫秒来响应)

这可确保在 API 响应事件到达时 JIS 仍在处理响应。


我想确认这是否是正确的方法(因为这对我来说是一种蛮力)或者是否有更清洁的方法。

【问题讨论】:

  • 如何调用您的 Web API?是改装吗?还有什么?
  • @pskink 是的。改造。
  • 所以使用sync requests
  • @pskink 正是我想要的。这很棒。我测试过,它工作正常。我想知道为什么这不会引发 NetworkOnMainThreadException 错误。是因为我在 Intent Service 中产生了请求吗?
  • 只是Log.d Thread.currentThread() 的值,你在logcat 上看到了什么?

标签: android android-service android-8.0-oreo jobintentservice


【解决方案1】:

在您的 JobService 中,您可以从 onStartJob() 返回 true,这表明您还有工作要做,因此 JIS 不会完成。收到响应后,您可以调用 finishJob() 来完成 JIS。

【讨论】:

  • 感谢您的回复。不幸的是,我使用的是 JobIntentService 而不是 JobService。因此无法访问 onStartJob() 和 onFinishJob()。
  • OK 在这种情况下,您可以使用 CountDownLatch。这些比 Thread.sleep() 更好。最终的 CountDownLatch 锁存器 = 新的 CountDownLatch(1);调用latch.await();触发您的 API 后,一旦完成调用 latch.countDown();
  • 感谢 Ankit。 TIL 关于 CountDownLatch。这将是我的后备计划,但我将使用@pskink 提供的解决方案,因为它更干净。
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多