diff --git a/app/build.gradle b/app/build.gradle index 4a3a24a..50f5900 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,4 +47,5 @@ dependencies { implementation libs.picasso implementation libs.rxjava implementation libs.rxandroid + implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' } diff --git a/app/src/main/java/otus/homework/reactivecats/CatsService.kt b/app/src/main/java/otus/homework/reactivecats/CatsService.kt index f30b3aa..e98252f 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsService.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsService.kt @@ -1,5 +1,6 @@ package otus.homework.reactivecats +import io.reactivex.Single import retrofit2.Call import retrofit2.http.GET @@ -7,5 +8,5 @@ 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/CatsViewModel.kt b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt index d62eaf9..65136a7 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.Flowable +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, @@ -17,9 +19,10 @@ class CatsViewModel( private val _catsLiveData = MutableLiveData() val catsLiveData: LiveData = _catsLiveData + val disposable = CompositeDisposable() init { - catsService.getCatFact().enqueue(object : Callback { + /*catsService.getCatFact().enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { if (response.isSuccessful && response.body() != null) { _catsLiveData.value = Success(response.body()!!) @@ -35,10 +38,28 @@ class CatsViewModel( override fun onFailure(call: Call, t: Throwable) { _catsLiveData.value = ServerError } - }) + })*/ + getFacts(catsService, localCatFactsGenerator) } - fun getFacts() {} + fun getFacts(catsService: CatsService, localCatFactsGenerator: LocalCatFactsGenerator) { + val dis = Flowable.interval(2, TimeUnit.SECONDS) + .flatMapSingle { + catsService.getCatFact() + .onErrorResumeNext { localCatFactsGenerator.generateCatFact() } + } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + _catsLiveData.value = Success(it) + }, + { + _catsLiveData.value = Error(it.message.toString()) + } + ) + disposable.add(dis) + } } 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 bbccfc7..c018bca 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/") .baseUrl("https://catfact.ninja/") + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build() } diff --git a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt index 4481062..ba51a1d 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,10 @@ class LocalCatFactsGenerator( * обернутую в подходящий стрим(Flowable/Single/Observable и т.п) */ fun generateCatFact(): Single { - return Single.never() + return Single.fromCallable { + val facts = context.resources.getStringArray(R.array.local_cat_facts) + Fact(facts[Random.nextInt(facts.size)]) + } } /** @@ -24,7 +28,11 @@ 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) + .map { + val facts = context.resources.getStringArray(R.array.local_cat_facts) + Fact(facts[Random.nextInt(facts.size)]) + } + .distinctUntilChanged() } } \ No newline at end of file