Модель представления Android всегда наблюдает

Я использую KoinDI, и у меня есть экран входа в систему. Вот мой код -

Мой код AppModule, который показывает определение LoginViewModel DI -

private val viewModelModules = module {
    viewModel { LoginViewModel(get()) }
}

Мой LoginFragment код -

private val viewModel: LoginViewModel by viewModel()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    view.login_button?.setOnClickListener {
        onLoginButtonPressed()
    }
}

private fun onLoginButtonPressed() {
        val email = view?.email_value?.text.toString()
        val password = view?.password_value?.text.toString()

        viewModel.onLoginPressed(email, password).observe(this, Observer {

                if (it.userLoggedIn) {
                    //...
                }
                handleError(it.error)

        })
}

Проблема заключается в том, что когда я нажимаю «Войти» и сразу же помещаю приложение в фоновый режим, и вызов API завершается с ошибкой (я намеренно отказываюсь от него для тестирования со стороны бэкэнда), и когда я вывожу приложение на передний план, я вижу, что модель просмотра продолжает наблюдать, что приводит к API вызов происходит снова и снова, пока он не увенчается успехом. Почему это происходит? Почему моя модель просмотра не может наблюдать только при нажатии кнопки входа?


person Ma2340    schedule 20.11.2019    source источник


Ответы (1)


Когда вы говорите viewModel.onLoginPressed.observe, активность/фрагмент будет получать события, когда он находится в состоянии started или resumed, а когда он уничтожается, наблюдатель будет автоматически удален.

Кажется, у вас есть логика повторных попыток внутри viewModel, которая продолжает повторять попытки.

person Mohamed Khaled    schedule 20.11.2019
comment
Вы абсолютно правы... Я сделал глупую ошибку в логике повторения. Спасибо - person Ma2340; 20.11.2019
comment
Рад, что смог быть полезен - person Mohamed Khaled; 20.11.2019