Sobes.tech
Middle

Milliseid mehhanisme saab kasutada presenterist päringute tühistamiseks?

sobes.tech AI

Vastus AI-lt

  • Surnud View: Esitaja ei hoia otse viidet View-ile, vaid saab selle interface'i kaudu kutsumise hetkel. Kui View enam ei eksisteeri, ei toimu kutsungit.

  • Seisundi lipud: View'is võib hoida lipu, mis näitab, kas see on aktiivne. Enne tegevuse teostamist, mis nõuab View'i, kontrollib esitaja seda lippu.

  • RxJava tellimusest loobumine: Kui suhtlemiseks kasutatakse Observable/Flowable, saab juhtida tellimust ja sellest loobuda View'i hävitamisel.

    // Esitajas
    private var disposable: Disposable? = null
    
    fun loadData() {
        disposable = model.getData()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ data ->
                view?.showData(data) // Null kontroll
            }, { error ->
                view?.showError(error) // Null kontroll
            })
    }
    
    fun detachView() {
        disposable?.dispose() // Tellimusest loobumine View'i hävitamisel
        view = null // Viite nullimine
    }
    
  • Tagasikutsumine View'i kontrolliga: Edastada tagasikutses objekt, mis kontrollib sees, kas View eksisteerib, enne tegevuse teostamist.

    // Esitajas
    fun processData(data: Data) {
        val uiCallback = object : UICallback {
            override fun onSuccess(result: Result) {
                view?.showResult(result) // Null kontroll
            }
            override fun onError(error: Throwable) {
                view?.showError(error) // Null kontroll
            }
        }
        model.doAsyncOperation(data, uiCallback)
    }
    
    // View'is
    interface UICallback {
        fun onSuccess(result: Result)
        fun onError(error: Throwable)
    }
    
  • Elu tsüklile teadlikud komponendid: Kasutada selliseid komponente, mis on teadlikud elutsüklist (näiteks Android arhitektuuri komponentide LifecycleObserver), et automaatselt tühistada päringud View'i oleku muutmisel.

    // Esitaja, mis on LifecycleObserver
    class MyPresenter(private val view: MyView) : LifecycleObserver {
    
        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun onDestroy() {
            // Operatsioonide tühistamine View'i hävitamisel
        }
    
        // ...
    }
    
    // View'is
    lifecycle.addObserver(presenter)