Sobes.tech
Middle

Koji mehanizmi se mogu koristiti za otkazivanje zahteva od presenter-a ka view-u?

sobes.tech АИ

Одговор од АИ

  • Мртва 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)
    }
    
  • Компоненте свесне за животни цикл: Коришћење компоненти које су свесне за животни цикл (нпр. LifecycleObserver у архитектурним компонентама Android), за аутоматско отказивање захтева при промени стања View.

    // У презентеру који је LifecycleObserver
    class MyPresenter(private val view: MyView) : LifecycleObserver {
    
        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun onDestroy() {
            // Отказивање операција при уништењу View
        }
    
        // ...
    }
    
    // У View
    lifecycle.addObserver(presenter)