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)