From c27a4cff9fbe73f8d46101294b7fbf47031ac296 Mon Sep 17 00:00:00 2001 From: Daria Boytsova Date: Mon, 1 Dec 2025 23:00:11 +0100 Subject: [PATCH 1/2] Homework corutines done --- .../java/otus/homework/coroutines/CatDataModel.kt | 3 +++ .../java/otus/homework/coroutines/CatsViewModel.kt | 4 ++++ app/src/main/java/otus/homework/coroutines/Image.kt | 10 ++++++++++ .../java/otus/homework/coroutines/ImageService.kt | 13 +++++++++++++ 4 files changed, 30 insertions(+) create mode 100644 app/src/main/java/otus/homework/coroutines/CatDataModel.kt create mode 100644 app/src/main/java/otus/homework/coroutines/CatsViewModel.kt create mode 100644 app/src/main/java/otus/homework/coroutines/Image.kt create mode 100644 app/src/main/java/otus/homework/coroutines/ImageService.kt diff --git a/app/src/main/java/otus/homework/coroutines/CatDataModel.kt b/app/src/main/java/otus/homework/coroutines/CatDataModel.kt new file mode 100644 index 00000000..3feb5d40 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatDataModel.kt @@ -0,0 +1,3 @@ +package otus.homework.coroutines + +data class CatDataModel() diff --git a/app/src/main/java/otus/homework/coroutines/CatsViewModel.kt b/app/src/main/java/otus/homework/coroutines/CatsViewModel.kt new file mode 100644 index 00000000..468b470e --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatsViewModel.kt @@ -0,0 +1,4 @@ +package otus.homework.coroutines + +class CatsViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/Image.kt b/app/src/main/java/otus/homework/coroutines/Image.kt new file mode 100644 index 00000000..643a5a33 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/Image.kt @@ -0,0 +1,10 @@ +package otus.homework.coroutines + +import com.google.gson.annotations.SerializedName + +data class Fact( + @field:SerializedName("fact") + val fact: String, + @field:SerializedName("length") + val length: Int +) \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/ImageService.kt b/app/src/main/java/otus/homework/coroutines/ImageService.kt new file mode 100644 index 00000000..46e9944e --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/ImageService.kt @@ -0,0 +1,13 @@ +package otus.homework.coroutines + +import retrofit2.Response +import retrofit2.http.GET + +interface CatsService { + + @GET("fact") + suspend fun getCatFact() : Response + + @GET ("v1/images/search") + suspend fun getImage() : Response +} \ No newline at end of file From d1a62cba7058b8d92dca09c4bb906f1a7adde0c6 Mon Sep 17 00:00:00 2001 From: Daria Boytsova Date: Mon, 1 Dec 2025 23:02:32 +0100 Subject: [PATCH 2/2] Now done --- app/build.gradle | 2 + .../otus/homework/coroutines/CatDataModel.kt | 5 ++- .../otus/homework/coroutines/CatsPresenter.kt | 42 ++++++++++++------- .../otus/homework/coroutines/CatsService.kt | 5 +-- .../java/otus/homework/coroutines/CatsView.kt | 24 +++++++++-- .../otus/homework/coroutines/CatsViewModel.kt | 42 ++++++++++++++++++- .../otus/homework/coroutines/CrashMonitor.kt | 3 +- .../otus/homework/coroutines/DiContainer.kt | 11 ++++- .../java/otus/homework/coroutines/Image.kt | 17 +++++--- .../otus/homework/coroutines/ImageService.kt | 10 ++--- .../otus/homework/coroutines/MainActivity.kt | 6 ++- app/src/main/res/layout/activity_main.xml | 18 ++++++-- 12 files changed, 141 insertions(+), 44 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a414e0e8..b744f125 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,4 +41,6 @@ dependencies { implementation 'com.google.android.material:material:1.11.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.squareup.picasso:picasso:2.71828' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3' + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatDataModel.kt b/app/src/main/java/otus/homework/coroutines/CatDataModel.kt index 3feb5d40..200ca653 100644 --- a/app/src/main/java/otus/homework/coroutines/CatDataModel.kt +++ b/app/src/main/java/otus/homework/coroutines/CatDataModel.kt @@ -1,3 +1,6 @@ package otus.homework.coroutines -data class CatDataModel() +data class CatDataModel( + val fact: Fact, + val imageUrl: String? +) diff --git a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt index e4b05120..1a15b9f2 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt @@ -1,30 +1,40 @@ package otus.homework.coroutines -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response +import kotlinx.coroutines.* +import otus.homework.coroutines.CrashMonitor.trackWarning +import java.net.SocketTimeoutException class CatsPresenter( - private val catsService: CatsService + private val catsService: CatsService, + private val imageService: ImageService, ) { private var _catsView: ICatsView? = null + private val scopeCats = CoroutineScope(Dispatchers.Main + CoroutineName("CatsCoroutine")) + fun onInitComplete() { - catsService.getCatFact().enqueue(object : Callback { - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful && response.body() != null) { - _catsView?.populate(response.body()!!) - } - } + scopeCats.launch { + try { + val responseFact = async {catsService.getCatFact()} + val responseImage = async {imageService.getImage().firstOrNull()} + + _catsView?.populate(CatDataModel(responseFact.await(), responseImage.await()?.url)) + - override fun onFailure(call: Call, t: Throwable) { - CrashMonitor.trackWarning() + } catch (e: SocketTimeoutException) { + val error = e.message ?: "Не удалось получить ответ от сервера" + _catsView?.showToast(error) + } catch (e: Exception) { + val errorMessage = e.message ?: "Unknown error" + trackWarning(errorMessage) + _catsView?.showToast(errorMessage) } - }) + } } + fun attachView(catsView: ICatsView) { _catsView = catsView } @@ -32,4 +42,8 @@ class CatsPresenter( fun detachView() { _catsView = null } -} \ No newline at end of file + + fun onStop() { + scopeCats.cancel() + } +} diff --git a/app/src/main/java/otus/homework/coroutines/CatsService.kt b/app/src/main/java/otus/homework/coroutines/CatsService.kt index 479b2cfb..8d847f32 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsService.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsService.kt @@ -1,10 +1,9 @@ package otus.homework.coroutines -import retrofit2.Call import retrofit2.http.GET interface CatsService { @GET("fact") - fun getCatFact() : Call -} \ No newline at end of file + suspend fun getCatFact() : Fact +} diff --git a/app/src/main/java/otus/homework/coroutines/CatsView.kt b/app/src/main/java/otus/homework/coroutines/CatsView.kt index be04b2a8..65805d8d 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsView.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsView.kt @@ -4,7 +4,10 @@ import android.content.Context import android.util.AttributeSet import android.widget.Button import android.widget.TextView +import android.widget.ImageView +import android.widget.Toast import androidx.constraintlayout.widget.ConstraintLayout +import com.squareup.picasso.Picasso class CatsView @JvmOverloads constructor( context: Context, @@ -13,20 +16,33 @@ class CatsView @JvmOverloads constructor( ) : ConstraintLayout(context, attrs, defStyleAttr), ICatsView { var presenter :CatsPresenter? = null + var viewModel: CatsViewModel? = null override fun onFinishInflate() { super.onFinishInflate() findViewById