From 5345b55057c80e595a3f6ca4ae27d27953b1ce7b Mon Sep 17 00:00:00 2001 From: vilvi Date: Tue, 13 May 2025 00:19:30 +0500 Subject: [PATCH 1/5] =?UTF-8?q?step=5F1:=20"=D0=9F=D0=B5=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D0=B5=D0=B4=D0=B8=D1=82=D0=B5=20=D1=81=D0=B5=D1=82=D0=B5=D0=B2?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=20=D1=81=20?= =?UTF-8?q?retrofit.Call=20=D0=BD=D0=B0=20RX=20=D1=86=D0=B5=D0=BF=D0=BE?= =?UTF-8?q?=D1=87=D0=BA=D1=83.=20=D0=94=D0=BB=D1=8F=20=D1=8D=D1=82=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=20Retrofit=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B5?= =?UTF-8?q?=D1=80,=20=D0=BF=D0=BE=D0=BC=D0=B5=D0=BD=D1=8F=D0=B9=D1=82?= =?UTF-8?q?=D0=B5=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5?= =?UTF-8?q?=D0=BC=D1=8B=D0=B5=20=D1=82=D0=B8=D0=BF=D1=8B=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=B9"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + app/src/main/java/otus/homework/reactivecats/CatsService.kt | 4 ++-- app/src/main/java/otus/homework/reactivecats/DiContainer.kt | 2 ++ app/src/main/java/otus/homework/reactivecats/MainActivity.kt | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 71df92dd..315f1a80 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,6 +37,7 @@ dependencies { implementation 'androidx.core:core-ktx:1.12.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' + implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' implementation 'com.google.code.gson:gson:2.10' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.11.0' diff --git a/app/src/main/java/otus/homework/reactivecats/CatsService.kt b/app/src/main/java/otus/homework/reactivecats/CatsService.kt index c79be483..17d1e38e 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsService.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsService.kt @@ -1,10 +1,10 @@ package otus.homework.reactivecats -import retrofit2.Call +import io.reactivex.Single import retrofit2.http.GET interface CatsService { @GET("random?animal_type=cat") - fun getCatFact(): Call + fun getCatFact(): Single } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/reactivecats/DiContainer.kt b/app/src/main/java/otus/homework/reactivecats/DiContainer.kt index dfbb9a2b..ad1aa751 100644 --- a/app/src/main/java/otus/homework/reactivecats/DiContainer.kt +++ b/app/src/main/java/otus/homework/reactivecats/DiContainer.kt @@ -2,6 +2,7 @@ package otus.homework.reactivecats import android.content.Context import retrofit2.Retrofit +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory import retrofit2.converter.gson.GsonConverterFactory class DiContainer { @@ -10,6 +11,7 @@ class DiContainer { Retrofit.Builder() .baseUrl("https://cat-fact.herokuapp.com/facts/") .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build() } diff --git a/app/src/main/java/otus/homework/reactivecats/MainActivity.kt b/app/src/main/java/otus/homework/reactivecats/MainActivity.kt index 8ec95711..bd3248a4 100644 --- a/app/src/main/java/otus/homework/reactivecats/MainActivity.kt +++ b/app/src/main/java/otus/homework/reactivecats/MainActivity.kt @@ -24,6 +24,7 @@ class MainActivity : AppCompatActivity() { setContentView(view) catsViewModel.catsLiveData.observe(this) { result -> when (result) { + is Loading -> Snackbar.make(view, "Loading ...", 1000).show() is Success -> view.populate(result.fact) is Error -> Toast.makeText(this, result.message, Toast.LENGTH_LONG).show() ServerError -> Snackbar.make(view, "Network error", 1000).show() From f6c3eeafa3869819e8456bed52a436cdbf2ff3cc Mon Sep 17 00:00:00 2001 From: vilvi Date: Tue, 13 May 2025 00:27:45 +0500 Subject: [PATCH 2/5] =?UTF-8?q?step=5F2:=20"=D0=9F=D0=BE=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=8F=D0=B9=D1=82=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D1=83?= =?UTF-8?q?=20=D0=B2=20CatsViewModel.kt=20=D1=81=20=D0=BA=D0=BE=D0=BB?= =?UTF-8?q?=D0=B1=D0=B5=D0=BA=D0=BE=D0=B2=20=D0=BD=D0=B0=20RX.=20=D0=9B?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8=D0=BA=D1=83=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B8=20=D1=83=D1=81=D0=BF=D0=B5=D1=85=D0=B0?= =?UTF-8?q?/=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=B8=D0=B7=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BB=D0=BB=D0=B1=D0=B5=D0=BA=D0=B0=20=D0=BD=D0=B5=D0=BE?= =?UTF-8?q?=D0=B1=D1=85=D0=BE=D0=B4=D0=B8=D0=BC=D0=BE=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D1=81=D1=82=D0=B8=20=D0=B2=20=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D0=BC=D0=B8=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D0=BB=D0=B1=D0=B5=D0=BA=D0=B8=20RX=20=D1=86?= =?UTF-8?q?=D0=B5=D0=BF=D0=BE=D1=87=D0=BA=D0=B8.=20=D0=9D=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B1=D1=83=D0=B4=D1=8C=D1=82=D0=B5=20=D0=BE=D1=87=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=82=D1=8C=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=20=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20ViewModel?= =?UTF-8?q?=20=D1=83=D0=BD=D0=B8=D1=87=D1=82=D0=BE=D0=B6=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../homework/reactivecats/CatsViewModel.kt | 57 ++++++++++++------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index d62eaf97..edfd30f4 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt @@ -5,9 +5,11 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.schedulers.Schedulers +import retrofit2.HttpException +import java.io.IOException class CatsViewModel( catsService: CatsService, @@ -18,27 +20,43 @@ class CatsViewModel( private val _catsLiveData = MutableLiveData() val catsLiveData: LiveData = _catsLiveData + private val compositeDisposable = CompositeDisposable() + init { - catsService.getCatFact().enqueue(object : Callback { - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful && response.body() != null) { - _catsLiveData.value = Success(response.body()!!) - } else { - _catsLiveData.value = Error( - response.errorBody()?.string() ?: context.getString( - R.string.default_error_text - ) - ) - } + val disposable = catsService.getCatFact() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnSubscribe { + _catsLiveData.postValue(Loading) } + .subscribe( + { fact -> + _catsLiveData.value = Success(fact) + }, + { error -> + _catsLiveData.value = when (error) { + is HttpException -> { + val errorMessage = error.response()?.message() + ?: context.getString(R.string.default_error_text) + Error(errorMessage) + } - override fun onFailure(call: Call, t: Throwable) { - _catsLiveData.value = ServerError - } - }) + is IOException -> ServerError + else -> + Error( + error.message ?: context.getString(R.string.default_error_text) + ) + } + } + ) + + compositeDisposable.add(disposable) } - fun getFacts() {} + override fun onCleared() { + super.onCleared() + compositeDisposable.clear() + } } class CatsViewModelFactory( @@ -55,4 +73,5 @@ class CatsViewModelFactory( sealed class Result data class Success(val fact: Fact) : Result() data class Error(val message: String) : Result() +object Loading : Result() object ServerError : Result() \ No newline at end of file From 759a92b66f84d94861a6065a407905505ba21358 Mon Sep 17 00:00:00 2001 From: vilvi Date: Tue, 13 May 2025 00:34:34 +0500 Subject: [PATCH 3/5] =?UTF-8?q?step=5F3:=20"=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D1=83=D0=B9=D1=82=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20otus.homework.reactivecats.LocalCatFactsGenerato?= =?UTF-8?q?r#generateCatFact,=20=D1=82=D0=B0=D0=BA,=20=D1=87=D1=82=D0=BE?= =?UTF-8?q?=D0=B1=D1=8B=20=D0=BE=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=B2?= =?UTF-8?q?=D1=80=D0=B0=D1=89=D0=B0=D0=BB=D0=B0=20Fact=20=D1=81=D0=BE=20?= =?UTF-8?q?=D1=81=D0=BB=D1=83=D1=87=D0=B0=D0=B9=D0=BD=D0=BE=D0=B9=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BA=D0=BE=D0=B9=20=D0=B8=D0=B7=20=D0=BC?= =?UTF-8?q?=D0=B0=D1=81=D1=81=D0=B8=D0=B2=D0=B0=20=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=20R.array.local=5Fcat=5Ffacts=20=D0=BE=D0=B1=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D1=83=D1=82=D1=83=D1=8E=20=D0=B2=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D1=85=D0=BE=D0=B4=D1=8F=D1=89=D0=B8=D0=B9=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B8=D0=BC(Flowable/Single/Observable=20=D0=B8=20=D1=82.?= =?UTF-8?q?=D0=BF)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../homework/reactivecats/LocalCatFactsGenerator.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt index 4481062e..954600e5 100644 --- a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt +++ b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt @@ -14,8 +14,11 @@ class LocalCatFactsGenerator( * чтобы она возвращала Fact со случайной строкой из массива строк R.array.local_cat_facts * обернутую в подходящий стрим(Flowable/Single/Observable и т.п) */ - fun generateCatFact(): Single { - return Single.never() + fun generateCatFact(): Single = Single.fromCallable { + val factsArray = context.resources.getStringArray(R.array.local_cat_facts) + val randomFactValue = factsArray.random() + val fact = Fact(text = randomFactValue) + fact } /** @@ -24,7 +27,8 @@ class LocalCatFactsGenerator( * Если вновь заэмиченный Fact совпадает с предыдущим - пропускаем элемент. */ fun generateCatFactPeriodically(): Flowable { - val success = Fact(context.resources.getStringArray(R.array.local_cat_facts)[Random.nextInt(5)]) + val success = + Fact(context.resources.getStringArray(R.array.local_cat_facts)[Random.nextInt(5)]) return Flowable.empty() } } \ No newline at end of file From 545a9ce5c604185b23d46ff5965c6c333a693ffa Mon Sep 17 00:00:00 2001 From: vilvi Date: Tue, 13 May 2025 00:46:53 +0500 Subject: [PATCH 4/5] =?UTF-8?q?step=5F4:=20"=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D1=83=D0=B9=D1=82=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20otus.homework.reactivecats.LocalCatFactsGenerato?= =?UTF-8?q?r#generateCatFactPeriodically=20=D1=82=D0=B0=D0=BA,=20=D1=87?= =?UTF-8?q?=D1=82=D0=BE=D0=B1=D1=8B=20=D0=BE=D0=BD=D0=B0=20=D1=8D=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D0=B8=D0=BB=D0=B0=20Fact=20=D1=81=D0=BE=20=D1=81?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B0=D0=B9=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=BE=D0=B9=20=D0=B8=D0=B7=20=D0=BC=D0=B0?= =?UTF-8?q?=D1=81=D1=81=D0=B8=D0=B2=D0=B0=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=20R.array.local=5Fcat=5Ffacts=20=D0=BA=D0=B0=D0=B6=D0=B4=D1=8B?= =?UTF-8?q?=D0=B5=202000=20=D0=BC=D0=B8=D0=BB=D0=BB=D0=B8=D1=81=D0=B5?= =?UTF-8?q?=D0=BA=D1=83=D0=BD=D0=B4.=20=D0=95=D1=81=D0=BB=D0=B8=20=D0=B2?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8C=20=D0=B7=D0=B0=D1=8D=D0=BC=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20Fact=20=D1=81=D0=BE=D0=B2?= =?UTF-8?q?=D0=BF=D0=B0=D0=B4=D0=B0=D0=B5=D1=82=20=D1=81=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D1=8B=D0=B4=D1=83=D1=89=D0=B8=D0=BC=20-=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=BF=D1=83=D1=81=D0=BA=D0=B0=D0=B5=D0=BC=20=D1=8D?= =?UTF-8?q?=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82."?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reactivecats/LocalCatFactsGenerator.kt | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt index 954600e5..e55634b3 100644 --- a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt +++ b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt @@ -3,7 +3,8 @@ package otus.homework.reactivecats import android.content.Context import io.reactivex.Flowable import io.reactivex.Single -import kotlin.random.Random +import io.reactivex.schedulers.Schedulers +import java.util.concurrent.TimeUnit class LocalCatFactsGenerator( private val context: Context @@ -14,11 +15,12 @@ class LocalCatFactsGenerator( * чтобы она возвращала Fact со случайной строкой из массива строк R.array.local_cat_facts * обернутую в подходящий стрим(Flowable/Single/Observable и т.п) */ + private val facts by lazy { + context.resources.getStringArray(R.array.local_cat_facts) + } + fun generateCatFact(): Single = Single.fromCallable { - val factsArray = context.resources.getStringArray(R.array.local_cat_facts) - val randomFactValue = factsArray.random() - val fact = Fact(text = randomFactValue) - fact + Fact(text = facts.random()) } /** @@ -27,8 +29,9 @@ class LocalCatFactsGenerator( * Если вновь заэмиченный Fact совпадает с предыдущим - пропускаем элемент. */ fun generateCatFactPeriodically(): Flowable { - val success = - Fact(context.resources.getStringArray(R.array.local_cat_facts)[Random.nextInt(5)]) - return Flowable.empty() + return Flowable + .interval(2, TimeUnit.SECONDS, Schedulers.io()) + .map { Fact(text = facts.random()) } + .onBackpressureLatest() } } \ No newline at end of file From 6400185ff8fd42f2a23ee82bf83b726d3b26fd51 Mon Sep 17 00:00:00 2001 From: vilvi Date: Thu, 15 May 2025 00:53:43 +0500 Subject: [PATCH 5/5] =?UTF-8?q?step=5F5:=20"=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D1=83=D0=B9=D1=82=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20otus.homework.reactivecats.CatsViewModel#getFact?= =?UTF-8?q?s=20=D1=81=D0=BB=D0=B5=D0=B4=D1=83=D1=8E=D1=89=D0=B8=D0=BC=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=BE=D0=BC:=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=B6=D0=B4=D1=8B=D0=B5=202=20=D1=81=D0=B5=D0=BA=D1=83=D0=BD?= =?UTF-8?q?=D0=B4=D1=8B=20=D0=B8=D0=B4=D0=B5=D0=BC=20=D0=B2=20=D1=81=D0=B5?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B7=D0=B0=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=BC=20?= =?UTF-8?q?=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D0=BC,=20=D0=B5=D1=81=D0=BB?= =?UTF-8?q?=D0=B8=20=D1=81=D0=B5=D1=82=D0=B5=D0=B2=D0=BE=D0=B9=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D1=80=D0=BE=D1=81=20=D0=B7=D0=B0=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=88=D0=B8=D0=BB=D1=81=D1=8F=20=D0=BD=D0=B5=D1=83=D1=81=D0=BF?= =?UTF-8?q?=D0=B5=D1=88=D0=BD=D0=BE,=20=D1=82=D0=BE=20=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=87=D0=B5=D1=81=D1=82=D0=B2=D0=B5=20=D1=84=D0=BE=D0=BB?= =?UTF-8?q?=D0=BB=D0=B1=D0=B5=D0=BA=D0=B0=20=D0=B8=D0=B4=D0=B5=D0=BC=20?= =?UTF-8?q?=D0=B7=D0=B0=20=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D0=BC=20=D0=B2=20?= =?UTF-8?q?=D1=83=D0=B6=D0=B5=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20otus.homework.reactiveca?= =?UTF-8?q?ts.LocalCatFactsGenerator#generateCatFact"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../homework/reactivecats/CatsViewModel.kt | 49 +++++++------------ 1 file changed, 17 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index edfd30f4..6e504508 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt @@ -5,16 +5,15 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import io.reactivex.Flowable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.schedulers.Schedulers -import retrofit2.HttpException -import java.io.IOException +import java.util.concurrent.TimeUnit class CatsViewModel( - catsService: CatsService, - localCatFactsGenerator: LocalCatFactsGenerator, - context: Context + private val catsService: CatsService, + private val localCatFactsGenerator: LocalCatFactsGenerator ) : ViewModel() { private val _catsLiveData = MutableLiveData() @@ -23,36 +22,22 @@ class CatsViewModel( private val compositeDisposable = CompositeDisposable() init { - val disposable = catsService.getCatFact() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .doOnSubscribe { - _catsLiveData.postValue(Loading) - } - .subscribe( - { fact -> - _catsLiveData.value = Success(fact) - }, - { error -> - _catsLiveData.value = when (error) { - is HttpException -> { - val errorMessage = error.response()?.message() - ?: context.getString(R.string.default_error_text) - Error(errorMessage) - } + getFacts() + } - is IOException -> ServerError - else -> - Error( - error.message ?: context.getString(R.string.default_error_text) - ) - } + private fun getFacts() { + compositeDisposable.add( + Flowable.interval(2, TimeUnit.SECONDS, Schedulers.io()) + .subscribeOn(Schedulers.io()) + .flatMapSingle { + catsService.getCatFact() + .onErrorResumeNext { localCatFactsGenerator.generateCatFact() } } - ) - - compositeDisposable.add(disposable) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe()) } + override fun onCleared() { super.onCleared() compositeDisposable.clear() @@ -67,7 +52,7 @@ class CatsViewModelFactory( ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T = - CatsViewModel(catsRepository, localCatFactsGenerator, context) as T + CatsViewModel(catsRepository, localCatFactsGenerator) as T } sealed class Result