From 0378b8f8b02eb7db0e6c309864c610afc4212e29 Mon Sep 17 00:00:00 2001 From: Dmitrii Kaluzhin Date: Fri, 12 Dec 2025 12:14:01 +0300 Subject: [PATCH] no message --- app/build.gradle | 1 + .../java/otus/homework/coroutines/CatImage.kt | 14 ++++++ .../java/otus/homework/coroutines/CatModel.kt | 6 +++ .../otus/homework/coroutines/CatsPresenter.kt | 40 +++++++++++++-- .../otus/homework/coroutines/CatsService.kt | 2 +- .../java/otus/homework/coroutines/CatsView.kt | 17 +++++-- .../otus/homework/coroutines/CatsViewModel.kt | 45 +++++++++++++++++ .../otus/homework/coroutines/CrashMonitor.kt | 2 +- .../otus/homework/coroutines/DiContainer.kt | 10 ++++ .../otus/homework/coroutines/ImageService.kt | 9 ++++ .../otus/homework/coroutines/MainActivity.kt | 49 ++++++++++++++++--- app/src/main/res/layout/activity_main.xml | 15 ++++-- 12 files changed, 190 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/otus/homework/coroutines/CatImage.kt create mode 100644 app/src/main/java/otus/homework/coroutines/CatModel.kt create mode 100644 app/src/main/java/otus/homework/coroutines/CatsViewModel.kt create mode 100644 app/src/main/java/otus/homework/coroutines/ImageService.kt diff --git a/app/build.gradle b/app/build.gradle index a414e0e8..a4c7a999 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,4 +41,5 @@ 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 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0' } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatImage.kt b/app/src/main/java/otus/homework/coroutines/CatImage.kt new file mode 100644 index 00000000..effa327d --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatImage.kt @@ -0,0 +1,14 @@ +package otus.homework.coroutines + +import com.google.gson.annotations.SerializedName + +data class CatImage( + @field:SerializedName("id") + val id: String, + @field:SerializedName("url") + val url: String, + @field:SerializedName("width") + val width: Int, + @field:SerializedName("height") + val height : Int +) diff --git a/app/src/main/java/otus/homework/coroutines/CatModel.kt b/app/src/main/java/otus/homework/coroutines/CatModel.kt new file mode 100644 index 00000000..f16e4ef8 --- /dev/null +++ b/app/src/main/java/otus/homework/coroutines/CatModel.kt @@ -0,0 +1,6 @@ +package otus.homework.coroutines + +data class CatModel ( + val text: String?, + val imageUrl: String? +) \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt index e4b05120..69bf6c9d 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt @@ -1,16 +1,41 @@ package otus.homework.coroutines -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response +import kotlinx.coroutines.CoroutineName +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.async +import kotlinx.coroutines.launch +import java.net.SocketTimeoutException class CatsPresenter( - private val catsService: CatsService + private val catsService: CatsService, + private val imageService: ImageService, + private val onShowToast: (String?) -> Unit ) { private var _catsView: ICatsView? = null + private val presenterScope = CoroutineScope(Dispatchers.Main + CoroutineName("CatsCoroutine")) + private var job: Job? = null fun onInitComplete() { + job = presenterScope.launch { + try { + val fact = async {catsService.getCatFact()} + val image = async {imageService.getCatImage().firstOrNull()} + _catsView?.populate(CatModel(fact.await().fact, image.await()?.url)) + } + catch (e: SocketTimeoutException) + { + onShowToast("Не удалось получить ответ от сервера") + } + catch (e: Exception) + { + onShowToast(e.message) + CrashMonitor.trackWarning(e.message) + } + } +/* catsService.getCatFact().enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { @@ -22,7 +47,7 @@ class CatsPresenter( override fun onFailure(call: Call, t: Throwable) { CrashMonitor.trackWarning() } - }) + })*/ } fun attachView(catsView: ICatsView) { @@ -32,4 +57,9 @@ class CatsPresenter( fun detachView() { _catsView = null } + + fun onStop() + { + job?.cancel() + } } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatsService.kt b/app/src/main/java/otus/homework/coroutines/CatsService.kt index 479b2cfb..ca9e3f73 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsService.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsService.kt @@ -6,5 +6,5 @@ import retrofit2.http.GET interface CatsService { @GET("fact") - fun getCatFact() : Call + suspend fun getCatFact() : Fact } \ No newline at end of file diff --git a/app/src/main/java/otus/homework/coroutines/CatsView.kt b/app/src/main/java/otus/homework/coroutines/CatsView.kt index be04b2a8..69ead663 100644 --- a/app/src/main/java/otus/homework/coroutines/CatsView.kt +++ b/app/src/main/java/otus/homework/coroutines/CatsView.kt @@ -3,8 +3,10 @@ package otus.homework.coroutines import android.content.Context import android.util.AttributeSet import android.widget.Button +import android.widget.ImageView import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout +import com.squareup.picasso.Picasso class CatsView @JvmOverloads constructor( context: Context, @@ -13,20 +15,27 @@ class CatsView @JvmOverloads constructor( ) : ConstraintLayout(context, attrs, defStyleAttr), ICatsView { var presenter :CatsPresenter? = null + var viewModel: CatsViewModel? = null override fun onFinishInflate() { super.onFinishInflate() findViewById