Sobes.tech
Middle

Jaké mechanismy lze použít k zrušení požadavků od presenteru k view?

sobes.tech AI

Odpověď od AI

  • Mrtvá View: Překladatel si neuchovává přímou referenci na View, ale získává ji přes rozhraní v okamžiku volání metody. Pokud View již neexistuje, volání se jednoduše neprovede.
  • Stavové vlajky: Ve View lze uložit vlajku, která ukazuje, zda je aktivní. Před provedením akce vyžadující View, překladatel zkontroluje tuto vlajku.
  • Odhlášení RxJava: Pokud se pro interakci používají Observable/Flowable, lze spravovat předplatné a odhlásit se při zničení View.
// V překladateli
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ášení při zničení View
    view = null // Nastavení odkazu na View na null
}
  • Callback s kontrolou View: Předávat jako callback objekt, který uvnitř kontroluje existenci View před provedením akce.
// V překladateli
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, které jsou vědomé životního cyklu: Použití komponent, které jsou vědomé životního cyklu (například LifecycleObserver v architektonických komponentách Android), pro automatické zrušení požadavků při změně stavu View.
// V překladateli, který je LifecycleObserver
class MyPresenter(private val view: MyView) : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() {
        // Zrušení operací při zničení View
    }

    // ...
}

// V View
lifecycle.addObserver(presenter)