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)