Sobes.tech
Middle

Kokius mechanizmus galima naudoti presenter iš view užklausų atšaukimui?

sobes.tech AI

Atsakymas iš AI

  • Mirusi View: Prezentorius ne saugo tiesioginės nuorodos į View, o gauna ją per sąsają iškvietimo metu. Jei View daugiau neegzistuoja, kvietimas tiesiog nevykdomas.

  • Būsenos žymekliai: View galima saugoti žymeklį, kuris nurodo, ar jis aktyvus. Prieš atliekant veiksmą, reikalaujantį View, prezentorius patikrina šį žymeklį.

  • RxJava atsisakymas: Jei sąveikai naudojami Observable/Flowable, galima valdyti prenumeratą ir atšaukti ją sunaikinus View.

    // Prezentoriuje
    private var disposable: Disposable? = null
    
    fun loadData() {
        disposable = model.getData()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ data ->
                view?.showData(data) // Tikrinimas dėl null
            }, { error ->
                view?.showError(error) // Tikrinimas dėl null
            })
    }
    
    fun detachView() {
        disposable?.dispose() // Atsisakymas sunaikinus View
        view = null // Nuorodos nulininimas
    }
    
  • Atgalinis kvietimas su View patikra: Perduoti kaip atgalinį kvietimą objektą, kuris viduje tikrina, ar View egzistuoja, prieš atliekant veiksmą.

    // Prezentoriuje
    fun processData(data: Data) {
        val uiCallback = object : UICallback {
            override fun onSuccess(result: Result) {
                view?.showResult(result) // Tikrinimas dėl null
            }
            override fun onError(error: Throwable) {
                view?.showError(error) // Tikrinimas dėl null
            }
        }
        model.doAsyncOperation(data, uiCallback)
    }
    
    // View
    interface UICallback {
        fun onSuccess(result: Result)
        fun onError(error: Throwable)
    }
    
  • Gyvenimo ciklo sąmoningos komponentės: Naudoti komponentes, kurios žino gyvenimo ciklą (pvz., Android architektūros komponentų LifecycleObserver), siekiant automatiškai atšaukti užklausas, kai keičiasi View būklė.

    // Prezentorius, kuris yra LifecycleObserver
    class MyPresenter(private val view: MyView) : LifecycleObserver {
    
        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun onDestroy() {
            // Operacijų atšaukimas, kai sunaikinamas View
        }
    
        // ...
    }
    
    // View
    lifecycle.addObserver(presenter)