Sobes.tech
Middle

Quais mecanismos podem ser utilizados para cancelar solicitações do presenter para a view?

sobes.tech IA

Resposta da IA

  • Vista Morta: O apresentador não mantém uma referência direta à vista, mas obtém-na através de uma interface no momento da chamada do método. Se a vista já não existir, a chamada simplesmente não ocorre.
  • Flags de estado: Na vista, pode-se armazenar uma flag que indica se ela está ativa. Antes de realizar uma ação que requer a vista, o apresentador verifica essa flag.
  • Desinscrição do RxJava: Se a interação usar Observable/Flowable, pode-se gerir a assinatura e desinscrever-se ao destruir a vista.
// No apresentador
private var disposable: Disposable? = null

fun loadData() {
    disposable = model.getData()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ data ->
            view?.showData(data) // Verificação de null
        }, { error ->
            view?.showError(error) // Verificação de null
        })
}

fun detachView() {
    disposable?.dispose() // Desinscrição ao destruir a vista
    view = null // Anulação da referência à vista
}
  • Callback com verificação da vista: Passar como callback um objeto que verifica a existência da vista antes de realizar a ação.
// No apresentador
fun processData(data: Data) {
    val uiCallback = object : UICallback {
        override fun onSuccess(result: Result) {
            view?.showResult(result) // Verificação de null
        }
        override fun onError(error: Throwable) {
            view?.showError(error) // Verificação de null
        }
    }
    model.doAsyncOperation(data, uiCallback)
}

// Na vista
interface UICallback {
    fun onSuccess(result: Result)
    fun onError(error: Throwable)
}
  • Componentes conscientes do ciclo de vida: Uso de componentes que são conscientes do ciclo de vida (por exemplo, LifecycleObserver em componentes arquiteturais Android) para cancelar automaticamente as requisições ao alterar o estado da vista.
// No apresentador, que é um LifecycleObserver
class MyPresenter(private val view: MyView) : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() {
        // Cancelar operações ao destruir a vista
    }

    // ...
}

// Na vista
lifecycle.addObserver(presenter)