Sobes.tech
Middle

Aké mechanizmy je možné použiť na zrušenie požiadaviek od presenter k view?

sobes.tech AI

Odpoveď od AI

  • Mŕtvy View: Prezentér ne uchováva priamu odkaz na View, ale získava ju cez rozhranie v momente volania metódy. Ak View už neexistuje, volanie sa jednoducho nevykoná.

  • Prvky stavu: Vo View je možné uchovávať príznak, ktorý indikuje, či je aktívne. Pred vykonaním akcie vyžadujúcej View, prezentér skontroluje tento príznak.

  • Odhlásenie RxJava: Ak sa na interakciu používajú Observable/Flowable, je možné spravovať odber a odhlásiť sa pri zničení View.

    // V prezentéri
    private var disposable: Disposable? = null
    
    fun loadData() {
        disposable = model.getData()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ data ->
                view?.showData(data) // Kontrola na null
            }, { error ->
                view?.showError(error) // Kontrola na null
            })
    }
    
    fun detachView() {
        disposable?.dispose() // Odhlásenie pri zničení View
        view = null // Nulovanie odkazu na View
    }
    
  • Callback s kontrolou View: Prenášať ako callback objekt, ktorý vo vnútri kontroluje existenciu View pred vykonaním akcie.

    // V prezentéri
    fun processData(data: Data) {
        val uiCallback = object : UICallback {
            override fun onSuccess(result: Result) {
                view?.showResult(result) // Kontrola na null
            }
            override fun onError(error: Throwable) {
                view?.showError(error) // Kontrola na null
            }
        }
        model.doAsyncOperation(data, uiCallback)
    }
    
    // V View
    interface UICallback {
        fun onSuccess(result: Result)
        fun onError(error: Throwable)
    }
    
  • Komponenty, ktoré sú si vedomé životného cyklu: Použitie komponentov, ktoré sú si vedomé životného cyklu (napr. LifecycleObserver v architektonických komponentoch Android), na automatické zrušenie požiadaviek pri zmene stavu View.

    // V prezentéri, ktorý je LifecycleObserver
    class MyPresenter(private val view: MyView) : LifecycleObserver {
    
        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun onDestroy() {
            // Zrušenie operácií pri zničení View
        }
    
        // ...
    }
    
    // V View
    lifecycle.addObserver(presenter)