Как стать автором
Обновить
6
0
Anton Sinitsyn @left-sinii

Android Developer

Отправить сообщение

Спасибо за статью! Думаю что данное решение можно улучшить с помощью SubcomposeLayout иначе мы убьемся об LINE_EXTRA_SPACE при локализации приложения.

В текущей реализации был использован вариант с обработкой этого исключения на уровне repository и дальнейшего преобразования в общий вид ошибки API.
Однако после вашего комментария я задумался как бы почистить код и перенес отлов exception в BaseViewModel, а так же добавил дефолтное отображение ошибки через SingleLiveEvent(могу рассказать подробнее, если нужно)

Примерный вид:
  private var viewModelJob = SupervisorJob()

  private inline fun <P> doCoroutineWork(
        crossinline doOnAsyncBlock: suspend CoroutineScope.() -> P,
        coroutineScope: CoroutineScope,
        context: CoroutineContext
    ) {
        coroutineScope.launch {
            withContext(context) {
                try {
                    doOnAsyncBlock.invoke(this)
                } catch (e: UnknownHostException) {
                    e.printStackTrace()
                    Log.d(TAG, "Server is unreachable")
                } catch (e: SocketTimeoutException) {
                    e.printStackTrace()
                    Log.d(TAG, "No internet connection")
                }
            }
        }
    }
но это подходит только если вы больше не планируете запускать на этом Job других корутин.

В моем примере .cancel() вызывается в onDestroy() фрагмента. Но для общего случая, замечание верное, добавил информацию в статью.

 @Override
    protected void onDestroy() {
        super.onDestroy();

        if (mViewModelStore != null && !isChangingConfigurations()) {
           mViewModelStore.clear();
        }

        mFragments.dispatchDestroy();
    }

Информация

В рейтинге
Не участвует
Откуда
Gzira, Malta, Мальта
Зарегистрирован
Активность