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)