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)