From 3895304db34225946f93509a2d3e86b954544b59 Mon Sep 17 00:00:00 2001 From: m_kolobanova Date: Sun, 14 Sep 2025 15:45:33 +0300 Subject: [PATCH 1/4] Add dependencies retrofit2:adapter-rxjava2 --- app/build.gradle | 1 + gradle/libs.versions.toml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 4a3a24a..7a973bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,4 +47,5 @@ dependencies { implementation libs.picasso implementation libs.rxjava implementation libs.rxandroid + implementation libs.retrofit2 } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 46c9578..e728595 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,6 +15,7 @@ picasso = "2.71828" retrofit = "2.9.0" rxandroid = "2.1.1" rxjava = "2.2.21" +rxjava2 = "3.0.0" [libraries] core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" } @@ -33,6 +34,7 @@ retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = retrofit-converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit" } rxandroid = { module = "io.reactivex.rxjava2:rxandroid", version.ref = "rxandroid" } rxjava = { module = "io.reactivex.rxjava2:rxjava", version.ref = "rxjava" } +retrofit2= {group = "com.squareup.retrofit2", name ="adapter-rxjava2", version.ref = "rxjava2"} [bundles] network = ["okhttp", "okhttp-logging-interceptor", "retrofit", "retrofit-converter-gson"] From fd60fdbd9f5dee6fe8e566c58f5c3876b1c7806b Mon Sep 17 00:00:00 2001 From: m_kolobanova Date: Sun, 14 Sep 2025 17:41:18 +0300 Subject: [PATCH 2/4] Connect JavaRX to Retrofit --- app/src/main/java/otus/homework/reactivecats/CatsService.kt | 5 +++-- app/src/main/java/otus/homework/reactivecats/DiContainer.kt | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/CatsService.kt b/app/src/main/java/otus/homework/reactivecats/CatsService.kt index f30b3aa..370a1d8 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsService.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsService.kt @@ -1,11 +1,12 @@ package otus.homework.reactivecats -import retrofit2.Call +import io.reactivex.Single + import retrofit2.http.GET interface CatsService { //@GET("random?animal_type=cat") @GET("fact") - 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 bbccfc7..41d4e3e 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 { @@ -11,6 +12,7 @@ class DiContainer { //.baseUrl("https://cat-fact.herokuapp.com/facts/") .baseUrl("https://catfact.ninja/") .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build() } From de5c10855941667c8f656ab8b8e84b63e1a79ad1 Mon Sep 17 00:00:00 2001 From: m_kolobanova Date: Sun, 14 Sep 2025 18:21:11 +0300 Subject: [PATCH 3/4] Add LocalCatFactsGenerator::generateCatFact(), LocalCatFactsGenerator::generateCatFactPeriodically() --- .../reactivecats/LocalCatFactsGenerator.kt | 14 +++++++++++--- 1 file changed, 11 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 4481062..f4720d8 100644 --- a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt +++ b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt @@ -3,6 +3,7 @@ package otus.homework.reactivecats import android.content.Context import io.reactivex.Flowable import io.reactivex.Single +import java.util.concurrent.TimeUnit import kotlin.random.Random class LocalCatFactsGenerator( @@ -15,7 +16,7 @@ class LocalCatFactsGenerator( * обернутую в подходящий стрим(Flowable/Single/Observable и т.п) */ fun generateCatFact(): Single { - return Single.never() + return Single.just(getRandomCatFact()) } /** @@ -24,7 +25,14 @@ 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(0, 2000, TimeUnit.MILLISECONDS) + .map { + getRandomCatFact() + }.distinctUntilChanged() + } + + fun getRandomCatFact(): Fact { + return Fact(context.resources.getStringArray(R.array.local_cat_facts)[Random.nextInt(5)]) } } \ No newline at end of file From 0a4187f4bdd79ec8cae8b0f27b1c798cac9e3029 Mon Sep 17 00:00:00 2001 From: m_kolobanova Date: Sun, 14 Sep 2025 22:27:25 +0300 Subject: [PATCH 4/4] Implement CatsViewModel.getFacts() --- .../homework/reactivecats/CatsViewModel.kt | 65 ++++++++++++------- .../reactivecats/LocalCatFactsGenerator.kt | 5 +- 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index d62eaf9..1da39d2 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt @@ -1,44 +1,65 @@ package otus.homework.reactivecats import android.content.Context +import android.util.Log 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 java.util.concurrent.TimeUnit class CatsViewModel( - catsService: CatsService, - localCatFactsGenerator: LocalCatFactsGenerator, + private val catsService: CatsService, + private val localCatFactsGenerator: LocalCatFactsGenerator, context: Context ) : ViewModel() { 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 - ) - ) - } - } + getFacts( + catsService = catsService, + localCatFactsGenerator = localCatFactsGenerator + ) + } - override fun onFailure(call: Call, t: Throwable) { - _catsLiveData.value = ServerError - } - }) + override fun onCleared() { + super.onCleared() + Log.d("${javaClass.name}#onCleared()", "") + compositeDisposable.dispose() } - fun getFacts() {} + private fun getFacts( + catsService: CatsService, + localCatFactsGenerator: LocalCatFactsGenerator + ) { + compositeDisposable.add( + catsService.getCatFact() + .onErrorResumeNext { + Log.d("${javaClass.name}#onErrorResumeNext", "Some problem with catService") + localCatFactsGenerator.generateCatFact() + } + .delay(2000, TimeUnit.MILLISECONDS) + .repeat() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { fact -> + Log.d("${javaClass.name}#onNext", fact.toString()) + _catsLiveData.value = Success(fact) + }, + { e -> + Log.d("${javaClass.name}#onError", e.toString()) + _catsLiveData.value = Error(e.message.toString()) + } + ) + ) + } } class CatsViewModelFactory( diff --git a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt index f4720d8..1e76b3c 100644 --- a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt +++ b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt @@ -1,6 +1,7 @@ package otus.homework.reactivecats import android.content.Context +import android.util.Log import io.reactivex.Flowable import io.reactivex.Single import java.util.concurrent.TimeUnit @@ -33,6 +34,8 @@ class LocalCatFactsGenerator( } fun getRandomCatFact(): Fact { - return Fact(context.resources.getStringArray(R.array.local_cat_facts)[Random.nextInt(5)]) + val fact = context.resources.getStringArray(R.array.local_cat_facts)[Random.nextInt(5)] + //Log.d("${javaClass.name}#getRandomCatFact()", "random fact = $fact") + return Fact(fact); } } \ No newline at end of file