Sobes.tech
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)