diff --git a/app/build.gradle b/app/build.gradle index 71df92dd..1f8bb5f4 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.9.0' } \ 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..66edcc23 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.Observable import retrofit2.http.GET interface CatsService { @GET("random?animal_type=cat") - fun getCatFact(): Call + fun getCatFact(): Observable } \ 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..f8bd4bf9 100644 --- a/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt +++ b/app/src/main/java/otus/homework/reactivecats/CatsViewModel.kt @@ -1,52 +1,63 @@ package otus.homework.reactivecats import android.content.Context -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 androidx.lifecycle.* +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, - localCatFactsGenerator: LocalCatFactsGenerator, + private val catsService: CatsService, + private val localCatFactsGenerator: LocalCatFactsGenerator, context: Context ) : ViewModel() { + private val compositeDisposable = 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 - ) - ) - } - } - - override fun onFailure(call: Call, t: Throwable) { - _catsLiveData.value = ServerError - } + getFacts() + } + + fun getFacts() { + val source = Flowable.interval(2000, TimeUnit.MILLISECONDS) + + val disposable = source.subscribe({ + val innerDisposable = catsService.getCatFact().subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()).repeat() + .subscribe({ fact -> _catsLiveData.value = Success(fact) }, { + val secondInnerDisposable = + localCatFactsGenerator.generateCatFact().subscribe({ fact -> + _catsLiveData.value = Success(fact) + }, { error -> + _catsLiveData.value = error.message?.let { return@let Error(it) } + ?: ServerError + }) + compositeDisposable.add(secondInnerDisposable) + }) + compositeDisposable.add(innerDisposable) + }, { error -> + _catsLiveData.value = error.message?.let { return@let Error(it) } ?: ServerError }) + + compositeDisposable.add(disposable) } - fun getFacts() {} + override fun onCleared() { + compositeDisposable.clear() + super.onCleared() + } } class CatsViewModelFactory( private val catsRepository: CatsService, private val localCatFactsGenerator: LocalCatFactsGenerator, private val context: Context -) : - ViewModelProvider.NewInstanceFactory() { +) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T = CatsViewModel(catsRepository, localCatFactsGenerator, context) as T 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/LocalCatFactsGenerator.kt b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt index 4481062e..5f481a2c 100644 --- a/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt +++ b/app/src/main/java/otus/homework/reactivecats/LocalCatFactsGenerator.kt @@ -3,7 +3,7 @@ package otus.homework.reactivecats import android.content.Context import io.reactivex.Flowable import io.reactivex.Single -import kotlin.random.Random +import java.util.concurrent.TimeUnit class LocalCatFactsGenerator( private val context: Context @@ -15,7 +15,10 @@ class LocalCatFactsGenerator( * обернутую в подходящий стрим(Flowable/Single/Observable и т.п) */ fun generateCatFact(): Single { - return Single.never() + return Single.create { + val facts = context.resources.getStringArray(R.array.local_cat_facts) + it.onSuccess(Fact(facts.random())) + } } /** @@ -24,7 +27,13 @@ class LocalCatFactsGenerator( * Если вновь заэмиченный Fact совпадает с предыдущим - пропускаем элемент. */ fun generateCatFactPeriodically(): Flowable { - val success = Fact(context.resources.getStringArray(R.array.local_cat_facts)[Random.nextInt(5)]) - return Flowable.empty() + val facts = context.resources.getStringArray(R.array.local_cat_facts) + return Flowable + .interval(2000L, TimeUnit.MICROSECONDS) + .flatMapSingle { + Single.create { + it.onSuccess(Fact(facts.random())) + } + } } } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/reactivecats/MainActivity.kt b/app/src/main/java/otus/homework/reactivecats/MainActivity.kt index 8ec95711..fff7d6a2 100644 --- a/app/src/main/java/otus/homework/reactivecats/MainActivity.kt +++ b/app/src/main/java/otus/homework/reactivecats/MainActivity.kt @@ -1,10 +1,9 @@ package otus.homework.reactivecats -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import androidx.activity.viewModels -import androidx.lifecycle.lifecycleScope +import androidx.appcompat.app.AppCompatActivity import com.google.android.material.snackbar.Snackbar class MainActivity : AppCompatActivity() {