Как периодически обновлять данные из Retrofit в MVVM с помощью WorkManager? - PullRequest
0 голосов
/ 24 февраля 2020

Помогите мне, пожалуйста.
У меня есть simpe Retrofit -> Repository -> MVVM -> Fragment приложение.
Что он делает, это обеспечивает текущую погоду от OpenWeatherApi.
У меня есть LiveData в моем ViewModel, наблюдаемом через Data Binding.
Все отлично работает.
Проблема:
Теперь мне нужен фоновый сервис, который обновляет данные о погоде каждые 20 минут.
Я пытаюсь реализовать это с помощью WorkManager.
И проблема в том, что я не знаю, как получить доступ к своему ViewModel и как обновить LiveData там.
Основной вопрос:
Как я могу периодически обновлять данные из Retrofit в MVVM с помощью WorkManager?
Вот мой код:
ViewModel:

class CurrentViewModel(application: Application) : AndroidViewModel(application) {
        val repo = mRepository.getInstance(application)
        val context = application
        //This is data i am observing by Data Binding
        var currentWeather: LiveData<CurrentWeather>? = repo.getCurrentWeather()
        //This method does not seem work when called explicitly btw.
        fun updateWeather(){
            currentWeather = repo.getCurrentWeather()
        }
    }

Репозиторий:

class mRepository private constructor(private val context: Context) {
    val retrofitClient = RetrofitResponseProvider()
    //From here I receive LiveData
    fun getCurrentWeather(): LiveData<CurrentWeather>? {
        return retrofitClient.getCurrentWeather()
    }
}

Дооснащение:

class RetrofitResponseProvider {
    fun getCurrentWeather(): LiveData<CurrentWeather>? {
        val currentWeatherLivedata: MutableLiveData<CurrentWeather> by lazy {
            MutableLiveData<CurrentWeather>()
        }
        val forecast = RetrofitClientInstanceProvider.getRetrofitInstance()?.create(WeatherApiService::class.java)
        val call = forecast?.getCurrentWeather()
        call?.enqueue(object : Callback<CurrentWeather> {
            override fun onResponse(call: Call<CurrentWeather>, response: Response<CurrentWeather>) {
                currentWeatherLivedata.value = response.body()
            }
            override fun onFailure(call: Call<CurrentWeather>, t: Throwable) {
            }
        })
        return currentWeatherLivedata
    }

WorkManager:

class MyWorker(val context: Context, val workerParams: WorkerParameters) :
    Worker(context, workerParams) {
    override fun doWork(): Result {
        //This is what I want it to do somehow
        viewModel.updateWeatherData()
        return Result.success()
    }

}

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