Я получаю push-уведомление от firebase, и я хочу синхронизировать данные с моего сервера, когда получаю это сообщение.Документация говорит, что не следует запускать какие-либо длительные задачи в обратном вызове onMessageReceived.
Поэтому я могу выбрать Service, IntentService или использовать WorkManager для запуска синхронизации.Это просто простая синхронизация, и мне не нужно ее запускать.Похоже, это отличный пример использования для запуска службы намерений для запуска синхронизации и обновления моей базы данных.
Моя проблема в том, что я использую пример Google для "NetworkBoundResource", т.е. у меня есть реализация для синхронизации исохранить пользователей здесь:
https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/repository/UserRepository.kt:
fun loadUser(login: String): LiveData<Resource<User>> {
return object : NetworkBoundResource<User, User>(appExecutors) {
override fun saveCallResult(item: User) {
userDao.insert(item)
}
override fun shouldFetch(data: User?) = data == null
override fun loadFromDb() = userDao.findByLogin(login)
override fun createCall() = githubService.getUser(login)
}.asLiveData()
}
Моя проблема в том, что если я позвоню из IntentService:
override fun onHandleIntent(intent: Intent?) {
val userId = intent.getLongExtra("userId")
userRepository.loadUser(userId)
}
Он не срабатывает.Я понял, что это происходит, потому что он возвращает объект LiveData, и, насколько я знаю, LiveData без наблюдателя ничего не делает.
Поскольку IntentService не является LifecycleOwner, я не могу наблюдать жилпаты:
override fun onHandleIntent(intent: Intent?) {
val userId = intent.getLongExtra("userId")
userRepository.loadUser(userId).observe(this, ... // nope this is not LifecycleOwner
}
Я, конечно, могу просто позвонить на сервер с моей услугой модернизации, проверить ответ, проанализировать результаты и сохранить в базе данных, но код NetworkBoundResource уже все это делает.
Любые идеи, какЯ могу использовать что-то вроде NetworkBoundResource, который возвращает liveata, но все еще использует это в моем IntentService?
Также я вижу, что есть LifecycleService, который я мог бы использовать, однако я теряю простоту, уже встроенную в IntentService, котораяОчереди намерений.