diff --git a/README.md b/README.md index 8b5decd7..d011e0af 100644 --- a/README.md +++ b/README.md @@ -2,20 +2,22 @@ ### Перейти с коллбеков на саспенд функции и корутины -1. Поменять возвращаемый тип в `CatsService` и добавить модификатор `suspend` -2. Переписать логику в презентере с `Callback` на корутины и `suspend` функции -3. Реализовать свой скоуп: PresenterScope с `MainDispatcher` и CoroutineName("CatsCoroutine") в качестве элементов контекста -4. Добавить обработку исключений через try-catch. В случае `java.net.SocketTimeoutException` показываем Toast с текстом "Не удалось получить ответ от сервером". В остальных случаях логируем исключение в `otus.homework.coroutines.CrashMonitor` и показываем Toast с `exception.message` -5. Не забываем отменять Job в `onStop()` ++1. Поменять возвращаемый тип в `CatFactsService` и добавить модификатор `suspend` ++2. Переписать логику в презентере с `Callback` на корутины и `suspend` функции ++3. Реализовать свой скоуп: PresenterScope с `MainDispatcher` и CoroutineName("CatsCoroutine") в качестве элементов контекста ++4. Добавить обработку исключений через try-catch. В случае `java.net.SocketTimeoutException` показываем Toast с текстом "Не удалось получить ответ от сервером". В остальных случаях логируем исключение в `otus.homework.coroutines.CrashMonitor` и показываем Toast с `exception.message` ++5. Не забываем отменять Job в `onStop()` ### Добавить к запросу фактов запрос рандомных картинок с [https://aws.random.cat/meow](https://aws.random.cat/meow) -1. На каждый рефреш экрана должен запрашиваться факт + картинка: добавляем сетевой запрос и реализуем логику аналогичную первой задаче. Для загрузки изображений уже подключена библиотека [Picasso](https://github.com/square/picasso) -2. В метод `view.populate` передаем 1 аргумент, поэтому необходимо реализовать модель презентейшен слоя в которой будут содержаться необходимые данные для рендеринга(текст и ссылка на картинку) -3. Отменятся запросы должны одновременно ++1. На каждый рефреш экрана должен запрашиваться факт + картинка: добавляем сетевой запрос и реализуем логику аналогичную первой задаче. Для загрузки изображений уже подключена библиотека [Picasso](https://github.com/square/picasso) ++2. В метод `view.populate` передаем 1 аргумент, поэтому необходимо реализовать модель презентейшен слоя в которой будут содержаться необходимые данные для рендеринга(текст и ссылка на картинку) +Оптимизируем: конвертер добавим, запустим запросы в сеть одновременно, одновременно попробуем джобы отменить +Для этого сделаем async запуск 2 корутин ++5. Отменятся запросы должны одновременно ### Реализовать решение ViewModel -1. Реализовать наследника `ViewModel` и продублировать в нем логику из `CatsPresenter`, с необходимыми изменениями. Используйте `viewModelScope` в качестве скоупа. -2. Добавить логирование ошибок через CoroutineExceptionHanlder. Используйте класс CrashMonitor в качестве фейкового CrashMonitor инструмента ++1. Реализовать наследника `ViewModel` и продублировать в нем логику из `CatsPresenter`, с необходимыми изменениями. Используйте `viewModelScope` в качестве скоупа. ++2. Добавить логирование ошибок через CoroutineExceptionHanlder. Используйте класс CrashMonitor в качестве фейкового CrashMonitor инструмента 3. Создать sealed класс `Result`. Унаследовать от него классы `Success`, `Error`. Использовать эти классы как стейт необходимый для рендеринга/отображени ошибки diff --git a/app/build.gradle b/app/build.gradle index 679dbba4..7c1641c0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,13 +4,13 @@ plugins { } android { - compileSdkVersion 30 + compileSdkVersion 32 buildToolsVersion "30.0.3" defaultConfig { applicationId "otus.homework.coroutines" minSdkVersion 23 - targetSdkVersion 30 + targetSdkVersion 32 versionCode 1 versionName "1.0" @@ -34,6 +34,10 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0' + implementation 'androidx.fragment:fragment-ktx:1.3.6' implementation 'androidx.core:core-ktx:1.3.2' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe34985b..fa531f7d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Coroutines"> - diff --git a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt b/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt deleted file mode 100644 index e4b05120..00000000 --- a/app/src/main/java/otus/homework/coroutines/CatsPresenter.kt +++ /dev/null @@ -1,35 +0,0 @@ -package otus.homework.coroutines - -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - -class CatsPresenter( - private val catsService: CatsService -) { - - private var _catsView: ICatsView? = null - - fun onInitComplete() { - catsService.getCatFact().enqueue(object : Callback { - - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful && response.body() != null) { - _catsView?.populate(response.body()!!) - } - } - - override fun onFailure(call: Call, t: Throwable) { - CrashMonitor.trackWarning() - } - }) - } - - fun attachView(catsView: ICatsView) { - _catsView = catsView - } - - fun detachView() { - _catsView = null - } -} \ 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 deleted file mode 100644 index 479b2cfb..00000000 --- a/app/src/main/java/otus/homework/coroutines/CatsService.kt +++ /dev/null @@ -1,10 +0,0 @@ -package otus.homework.coroutines - -import retrofit2.Call -import retrofit2.http.GET - -interface CatsService { - - @GET("fact") - fun getCatFact() : Call -} \ 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 deleted file mode 100644 index 30ac2531..00000000 --- a/app/src/main/java/otus/homework/coroutines/CatsView.kt +++ /dev/null @@ -1,32 +0,0 @@ -package otus.homework.coroutines - -import android.content.Context -import android.util.AttributeSet -import android.widget.Button -import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout - -class CatsView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), ICatsView { - - var presenter :CatsPresenter? = null - - override fun onFinishInflate() { - super.onFinishInflate() - findViewById