Sobes.tech
Middle

Milyen mechanizmusokat lehet használni a presenterből a view felé irányuló kérések törlésére?

sobes.tech MI

Válasz az MI-től

  • Halott Nézet: A prezentőr nem tart közvetlen hivatkozást a nézetre, hanem az interfészen keresztül szerzi meg a hívás pillanatában. Ha a nézet már nem létezik, a hívás egyszerűen nem történik meg.
  • Állapot zászlók: A nézetben tárolható egy zászló, amely jelzi, hogy aktív-e. Mielőtt olyan műveletet hajtana végre, amely a nézetet igényli, a prezentőr ellenőrzi ezt a zászlót.
  • RxJava leiratkozás: Ha Observable/Flowable használatával történik az interakció, kezelhető a feliratkozás és leiratkozás a nézet megsemmisítésekor.
// A prezentőrben
private var disposable: Disposable? = null

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

fun detachView() {
    disposable?.dispose() // Leiratkozás a nézet megsemmisítésekor
    view = null // A nézet hivatkozásának nullázása
}
  • Visszahívás nézet ellenőrzéssel: Olyan objektum átadása, amely belül ellenőrzi a nézet létezését, mielőtt végrehajtaná a műveletet.
// A prezentőrben
fun processData(data: Data) {
    val uiCallback = object : UICallback {
        override fun onSuccess(result: Result) {
            view?.showResult(result) // null ellenőrzés
        }
        override fun onError(error: Throwable) {
            view?.showError(error) // null ellenőrzés
        }
    }
    model.doAsyncOperation(data, uiCallback)
}

// A nézetben
interface UICallback {
    fun onSuccess(result: Result)
    fun onError(error: Throwable)
}
  • Életciklus-tudatos komponensek: Az Android architektúra komponenseiben (pl. LifecycleObserver) való használat az automatikus kérésmegszakításhoz a nézet állapotának változásakor.
// A prezentőrben, aki LifecycleObserver
class MyPresenter(private val view: MyView) : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() {
        // Műveletek megszakítása a nézet megsemmisítésekor
    }

    // ...
}

// A nézetben
lifecycle.addObserver(presenter)