How to update data from Retrofit periodically in MVVM using WorkManager?
Asked Answered
L

0

7

Help me out please.
I have a simpe Retrofit->Repository->MVVM->Fragment app.
What it does is provides current weather from OpenWeatherApi.
I have my LiveData in my ViewModel observed via Data Binding.
It all works fine.
Issue:
Now I want a background service which updates weather data every 20 minutes.
Im trying to implement this with WorkManager.
And the problem is that I don’t know how to access my ViewModel and how to update LiveData there.
Main question:
How can I update data from Retrofit periodically in MVVM using WorkManager?
Here is my code:
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()
        }
    }

Repository:

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

Retrofit:

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()
    }

}

Lusitania answered 23/2, 2020 at 21:5 Comment(1)
Take a look at this: codelabs.developers.google.com/codelabs/…Grandmotherly

© 2022 - 2024 — McMap. All rights reserved.