【问题标题】:Android Workmanager: Wait for BroadcastReceiver before returning ResultAndroid Workmanager:在返回结果之前等待 BroadcastReceiver
【发布时间】:2019-06-19 19:23:11
【问题描述】:

我正在使用SmsManager 发送短信,并使用WorkManager 在后台发送短信。由于消息的数量是动态的,我为此链接了WorkerRequest。这是sn-p:

private fun startSmsWork(sms: Array<SmsEntity>) {
    val gson = Gson()

    val smsWorkerRequestBuilder = OneTimeWorkRequestBuilder<SmsWorker>()
      smsWorkerRequestBuilder.setInputData(workDataOf(SMS_WORKER_INPUT_KEY to gson.toJson(sms[0])))

    var continuation = WorkManager.getInstance()
      .beginWith(smsWorkerRequestBuilder.build())

    for (i in 1 until sms.size) {
      smsWorkerRequestBuilder.setInputData(workDataOf(SMS_WORKER_INPUT_KEY to gson.toJson(sms[i])))
      continuation = continuation.then(smsWorkerRequestBuilder.build())
    }

    continuation.enqueue()
}

这是我的工人阶级:

class SmsWorker(ctx: Context, workerParams: WorkerParameters) : Worker(ctx, workerParams) {

  override fun doWork(): Result {
    return try {
      val data = inputData.getString(SMS_WORKER_INPUT_KEY)
      val messages = Gson().fromJson(data, SmsEntity::class.java)
      sendSms(messages)
      Result.success()
    } catch (e: Exception) {
      Log.e("Sms", e.localizedMessage)
      Result.failure()
    }
  }

  private fun sendSms(msg: SmsEntity) {
    try {
      Log.d("SmsWorker", "Sending message ${msg.id}....")
      val sentIntent = Intent(SENT_INTENT_ACTION)
      sentIntent.putExtra(SENT_INTENT_EXTRA, msg.id)
      val sentPI = PendingIntent.getBroadcast(applicationContext, 0, sentIntent, 0)

      val deliveredIntent = Intent(DELIVERED_INTENT_ACTION)
      deliveredIntent.putExtra(DELIVERED_INTENT_EXTRA, msg.id)
      val deliveredPI = PendingIntent.getBroadcast(applicationContext, 0, sentIntent, 0)

      val smsManager = SmsManager.getDefault()
      smsManager.sendTextMessage(msg.num, null, msg.message, sentPI, deliveredPI)
    } catch (e: Exception) {
      Log.e("Sms", e.localizedMessage)
    }
  }
}

它工作正常,但我希望能够监控发送的每条消息。所以我为此添加了BroadcastReceiver,但BroadcastReceiver 接收的意图只是最新的(如果有多条消息)。我发现在发送消息之前我必须等待发送消息。

我的问题是如何在我的工作类中实现它,它应该在返回Result 对象之前等待BroadcastReceiver 中的结果。

非常感谢任何意见

【问题讨论】:

  • 聚会有点晚了,但我遇到了同样的问题,广播接收器接收到上一条消息的数据多次。解决方案是将消息 id 分配给待处理意图的操作字段,这迫使操作系统分别处理不同的回调

标签: android broadcastreceiver android-workmanager


【解决方案1】:

如果您想在工作进程中异步等待操作结果,请使用 ListenableWorker。

另外,一些一般性建议:由于您正在处理 SMS,我很确定您的工作需要网络限制。如果这对您的用例有意义,您可能还想查看独特的工作和附加内容。

【讨论】:

  • 感谢您的回复。我最终移除了链并为广播接收器设置了一个侦听器,它将开始一项独特的工作。网络限制不是指wifi或移动数据吗?我不太确定,我计划每 N 分钟运行一次定期工作,以检查是否有消息需要重新发送。
  • 除非您可以通过 WiFi 发送短信,否则您可能需要一个按流量计费的网络发送短信。具体来说,没有任何网络连接意味着什么都不会发送。
猜你喜欢
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
相关资源
最近更新 更多