Сценарий
Я реализовал виджет приложения Android.
При нажатии на виджет запускается трансляция с использованием PendingIntent.getBroadcast(...)
.
Я хочу создать сетьзапрос внутри onReceive
Broadcast Receiver.
(Вы спрашиваете, почему я не использую PendingIntent.getService(...)
и не запускаю IntentService
? Хорошо, это естественная идея, но, к сожалению, из-за фоновых ограничений, сервисне может быть запущено, если приложение не на переднем плане. Вы можете взглянуть на этот пост .)
Задача
Чтобы доказать, что это работает, я реализовал примерBroadcastReceiver:
class WidgetClickBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (context == null || intent == null) return
Log.i("Sira", "onReceive called")
val pendingResult = goAsync()
Observable.just(true).delay(3, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
Log.i("Sira", "Fake completion of network call")
pendingResult.finish()
}
}
}
Да, это работает.
Тем не менее, я заметил, что если я нажму на виджет несколько раз, несколько трансляций будут создаваться и помещаться в очередь один за другим до предыдущегоpendingResult.finish()
называется.
Это может быть объяснено документацией goAsync()
:
Имейте в виду, что работа, которую вы здесь делаете, будет блокировать дальнейшие трансляции, пока она не завершится,так что пользуясь этим вообщеvely может привести к обратным результатам и привести к более медленному получению последующих событий.
Поэтому я хочу знать, есть ли способ предотвратить запуск одной и той же трансляции несколько раз, если она уже находится вочередь?
Или каким-либо другим способом предотвратить очереди вызовов из-за сумасшедших нажатий на виджет?