Middle
Jakie mechanizmy można wykorzystać do anulowania żądań od presenter do widoku?
sobes.tech AI
Odpowiedź od AI
- Martwe Widok: Prezentator nie przechowuje bezpośredniego odwołania do widoku, lecz otrzymuje je przez interfejs w momencie wywołania metody. Jeśli widok już nie istnieje, wywołanie po prostu nie następuje.
- Flagi stanu: W widoku można przechowywać flagę wskazującą, czy jest aktywny. Przed wykonaniem działania wymagającego widoku, prezenter sprawdza tę flagę.
- Odsubskrybowanie RxJava: Jeśli do interakcji używa się Observable/Flowable, można zarządzać subskrypcją i odsubskrybować ją przy niszczeniu widoku.
// W prezenterze
private var disposable: Disposable? = null
fun loadData() {
disposable = model.getData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ data ->
view?.showData(data) // Sprawdzenie na null
}, { error ->
view?.showError(error) // Sprawdzenie na null
})
}
fun detachView() {
disposable?.dispose() // Odsubskrybowanie przy niszczeniu widoku
view = null // Zerowanie odwołania do widoku
}
- Callback z sprawdzaniem widoku: Przekazywać jako callback obiekt, który wewnątrz sprawdza istnienie widoku przed wykonaniem działania.
// W prezenterze
fun processData(data: Data) {
val uiCallback = object : UICallback {
override fun onSuccess(result: Result) {
view?.showResult(result) // Sprawdzenie na null
}
override fun onError(error: Throwable) {
view?.showError(error) // Sprawdzenie na null
}
}
model.doAsyncOperation(data, uiCallback)
}
// W widoku
interface UICallback {
fun onSuccess(result: Result)
fun onError(error: Throwable)
}
- Komponenty świadome cyklu życia: Użycie komponentów, które są świadome cyklu życia (np. LifecycleObserver w architekturze Android), do automatycznego anulowania zapytań przy zmianie stanu widoku.
// W prezenterze, który jest LifecycleObserverem
class MyPresenter(private val view: MyView) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
// Anulowanie operacji przy niszczeniu widoku
}
// ...
}
// W widoku
lifecycle.addObserver(presenter)