Sobes.tech
Middle

What mechanisms can be used to cancel requests from presenter to view?

sobes.tech AI

Answer from AI

  • Dead View: The presenter does not hold a direct reference to the View but receives it through an interface at the moment of method call. If the View no longer exists, the call simply does not happen.

  • State flags: The View can store a flag indicating whether it is active. Before performing an action that requires the View, the presenter checks this flag.

  • RxJava unsubscription: If Observable/Flowable are used for interaction, you can manage subscriptions and unsubscribe when the View is destroyed.

    // In the presenter
    private var disposable: Disposable? = null
    
    fun loadData() {
        disposable = model.getData()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ data ->
                view?.showData(data) // Null check
            }, { error ->
                view?.showError(error) // Null check
            })
    }
    
    fun detachView() {
        disposable?.dispose() // Unsubscribe when View is destroyed
        view = null // Nullify the View reference
    }
    
  • Callback with View check: Pass an object as a callback that internally checks for the existence of the View before performing an action.

    // In the presenter
    fun processData(data: Data) {
        val uiCallback = object : UICallback {
            override fun onSuccess(result: Result) {
                view?.showResult(result) // Null check
            }
            override fun onError(error: Throwable) {
                view?.showError(error) // Null check
            }
        }
        model.doAsyncOperation(data, uiCallback)
    }
    
    // In the View
    interface UICallback {
        fun onSuccess(result: Result)
        fun onError(error: Throwable)
    }
    
  • Lifecycle-aware components: Use components aware of the lifecycle (e.g., LifecycleObserver in Android architecture components) for automatic cancellation of requests when the View's state changes.

    // In the presenter, which is a LifecycleObserver
    class MyPresenter(private val view: MyView) : LifecycleObserver {
    
        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun onDestroy() {
            // Cancel operations when the View is destroyed
        }
    
        // ...
    }
    
    // In the View
    lifecycle.addObserver(presenter)
    
What mechanisms can be used to cancel requests from… - sobes.tech