Sobes.tech
Middle

Welke mechanismen kunnen worden gebruikt om verzoeken van de presenter naar de view te annuleren?

sobes.tech AI

Antwoord van AI

  • Dode View: De presenter houdt geen directe verwijzing naar de View, maar krijgt deze via een interface op het moment van de methode-aanroep. Als de View niet meer bestaat, gebeurt de oproep gewoon niet.
  • Statusvlaggen: In de View kan een vlag worden opgeslagen die aangeeft of deze actief is. Voordat een actie wordt uitgevoerd die de View vereist, controleert de presenter deze vlag.
  • RxJava afmelden: Als interactie wordt gedaan met Observable/Flowable, kan de inschrijving worden beheerd en worden afgemeld bij het vernietigen van de View.
// In de presenter
private var disposable: Disposable? = null

fun loadData() {
    disposable = model.getData()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ data ->
            view?.showData(data) // Nullcontrole
        }, { error ->
            view?.showError(error) // Nullcontrole
        })
}

fun detachView() {
    disposable?.dispose() // Afmelden bij vernietiging van de View
    view = null // Verwijzing naar de View nullen
}
  • Callback met View-controle: Een object doorgeven dat binnenin controleert of de View bestaat voordat de actie wordt uitgevoerd.
// In de presenter
fun processData(data: Data) {
    val uiCallback = object : UICallback {
        override fun onSuccess(result: Result) {
            view?.showResult(result) // Nullcontrole
        }
        override fun onError(error: Throwable) {
            view?.showError(error) // Nullcontrole
        }
    }
    model.doAsyncOperation(data, uiCallback)
}

// In de View
interface UICallback {
    fun onSuccess(result: Result)
    fun onError(error: Throwable)
}
  • Componenten die zich bewust zijn van de levenscyclus: Gebruik maken van componenten die zich bewust zijn van de levenscyclus (bijvoorbeeld, LifecycleObserver in Android architectuurcomponenten) om automatisch verzoeken te annuleren bij verandering van de View-status.
// In de presenter, die een LifecycleObserver is
class MyPresenter(private val view: MyView) : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() {
        // Operaties annuleren bij vernietiging van de View
    }

    // ...
}

// In de View
lifecycle.addObserver(presenter)