Помогите мне, пожалуйста.
У меня есть 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()
}
}