Получение данных с сервера после push-уведомления Firebase - PullRequest
0 голосов
/ 27 апреля 2019

Я получаю 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, котораяОчереди намерений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...