From fe2c0aaab795da975f654f74fbbc65136206bccc Mon Sep 17 00:00:00 2001 From: Hp Date: Mon, 14 Apr 2025 10:04:06 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=201,2=20(=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4=20=D0=BD?= =?UTF-8?q?=D0=B0=20Rx)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + .../otus/homework/reactivecats/CatsService.kt | 4 +- .../homework/reactivecats/CatsViewModel.kt | 50 ++++++++++++------- .../otus/homework/reactivecats/DiContainer.kt | 2 + 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 71df92dd..35449585 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,4 +46,5 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0' implementation "io.reactivex.rxjava2:rxjava:2.2.21" implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' + implementation "com.squareup.retrofit2:adapter-rxjava2:2.7.1" } \ No newline at end of file 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/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index d62eaf97..f24fe773 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, @@ -15,30 +17,40 @@ class CatsViewModel( context: Context ) : ViewModel() { + private val disposables = CompositeDisposable() + private val _catsLiveData = MutableLiveData() val catsLiveData: LiveData = _catsLiveData 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 + disposables.add( + catsService.getCatFact() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ data -> + _catsLiveData.value = Success(data) + }, { throwable -> + _catsLiveData.value = when (throwable) { + is IOException -> ServerError + is HttpException -> Error( + throwable.response()?.errorBody()?.string() ?: context.getString( + R.string.default_error_text + ) ) - ) - } - } - - override fun onFailure(call: Call, t: Throwable) { - _catsLiveData.value = ServerError - } - }) + + else -> Error(context.getString(R.string.default_error_text)) + } + + }) + ) } fun getFacts() {} + + override fun onCleared() { + super.onCleared() + disposables.clear() + } } class CatsViewModelFactory( 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() } From 214981735dfc8019af9ff41ca1c78da8cbc8c553 Mon Sep 17 00:00:00 2001 From: Hp Date: Mon, 14 Apr 2025 12:29:24 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=203=20(=D1=84-=D1=8F=20generateCatFact)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../otus/homework/reactivecats/LocalCatFactsGenerator.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt index 4481062e..07ac1aa5 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 io.reactivex.schedulers.Schedulers import kotlin.random.Random class LocalCatFactsGenerator( @@ -15,7 +16,11 @@ class LocalCatFactsGenerator( * обернутую в подходящий стрим(Flowable/Single/Observable и т.п) */ fun generateCatFact(): Single { - return Single.never() + return Single.fromCallable { + val factsArray = context.resources.getStringArray(R.array.local_cat_facts) + val randomFact = factsArray.random() + Fact(randomFact) + } } /** From f997b5bdd09ba4de76d0a5d0a32be5f1620ea3e9 Mon Sep 17 00:00:00 2001 From: Hp Date: Mon, 14 Apr 2025 13:03:09 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=204=20(=D1=84-=D1=8F=20generateCatFactPeriodically)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../homework/reactivecats/LocalCatFactsGenerator.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt index 07ac1aa5..42f126bf 100644 --- a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt +++ b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt @@ -2,8 +2,10 @@ package otus.homework.reactivecats import android.content.Context import io.reactivex.Flowable +import io.reactivex.Scheduler import io.reactivex.Single import io.reactivex.schedulers.Schedulers +import java.util.concurrent.TimeUnit import kotlin.random.Random class LocalCatFactsGenerator( @@ -29,7 +31,11 @@ class LocalCatFactsGenerator( * Если вновь заэмиченный Fact совпадает с предыдущим - пропускаем элемент. */ fun generateCatFactPeriodically(): Flowable { - val success = Fact(context.resources.getStringArray(R.array.local_cat_facts)[Random.nextInt(5)]) - return Flowable.empty() + val factsArray = context.resources.getStringArray(R.array.local_cat_facts) + return Flowable.interval(2, TimeUnit.SECONDS, Schedulers.io()) + .map { + Fact(factsArray[Random.nextInt(factsArray.size)]) + } + .distinctUntilChanged() } } \ No newline at end of file From 9de685817186b8ec09436e3596963c42499d3af8 Mon Sep 17 00:00:00 2001 From: Hp Date: Mon, 14 Apr 2025 13:24:53 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=205=20(=D1=84-=D1=8F=20getFacts)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../otus/homework/reactivecats/CatsViewModel.kt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index f24fe773..d5b63f4a 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt @@ -5,15 +5,17 @@ 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, + val catsService: CatsService, + val localCatFactsGenerator: LocalCatFactsGenerator, context: Context ) : ViewModel() { @@ -45,7 +47,14 @@ class CatsViewModel( ) } - fun getFacts() {} + fun getFacts(): Flowable { + return Flowable.interval(2, TimeUnit.SECONDS, Schedulers.io()) + .flatMapSingle { _ -> + catsService.getCatFact() + .onErrorResumeNext(localCatFactsGenerator.generateCatFact()) + .subscribeOn(Schedulers.io()) + } + } override fun onCleared() { super.onCleared()