Назад к вопросам
Middle
72
questionbank

Какие механизмы можно использовать для отмены запросов от presenter к view?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  • Мертвая View: Презентер не хранит прямую ссылку на View, а получает ее через интерфейс в момент вызова метода. Если View больше не существует, вызов просто не происходит.

  • Флаги состояния: В View можно хранить флаг, указывающий, активно ли оно. Перед выполнением действия, требующего View, презентер проверяет этот флаг.

  • RxJava отписка: Если для взаимодействия используются Observable/Flowable, можно управлять подпиской и отписываться от нее при уничтожении View.

    // В презентере
    private var disposable: Disposable? = null
    
    fun loadData() {
        disposable = model.getData()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ data ->
                view?.showData(data) // Проверка на null
            }, { error ->
                view?.showError(error) // Проверка на null
            })
    }
    
    fun detachView() {
        disposable?.dispose() // Отписка при уничтожении View
        view = null // Обнуление ссылки на View
    }
    
  • Callback с проверкой View: Передавать в качестве callback-а объект, который внутри себя проверяет существование View перед выполнением действия.

    // В презентере
    fun processData(data: Data) {
        val uiCallback = object : UICallback {
            override fun onSuccess(result: Result) {
                view?.showResult(result) // Проверка на null
            }
            override fun onError(error: Throwable) {
                view?.showError(error) // Проверка на null
            }
        }
        model.doAsyncOperation(data, uiCallback)
    }
    
    // В View
    interface UICallback {
        fun onSuccess(result: Result)
        fun onError(error: Throwable)
    }
    
  • Lifecycle-aware компоненты: Использование компонентов, aware-ных к жизненному циклу (например, LifecycleObserver в архитектурных компонентах Android), для автоматической отмены запросов при изменении состояния View.

    // В презентере, который является LifecycleObserver
    class MyPresenter(private val view: MyView) : LifecycleObserver {
    
        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun onDestroy() {
            // Отмена операций при уничтожении View
        }
    
        // ...
    }
    
    // В View
    lifecycle.addObserver(presenter)