Sobes.tech
Middle

Kādus mehānismus var izmantot, lai atceltu pieprasījumus no presenter uz view?

sobes.tech AI

Atbilde no AI

  • Mirusi View: Prezentētājs nepatur tiešu saiti uz View, bet to saņem caur interfeisu brīdī, kad tiek izsaukta metode. Ja View vairs nepastāv, izsaukums vienkārši nenotiek.

  • Stāvokļa zīmes: View var glabāt zīmi, kas norāda, vai tas ir aktīvs. Pirms veikt darbību, kas prasa View, prezentētājs pārbauda šo zīmi.

  • RxJava atteikšanās: Ja ar mijiedarbību tiek izmantoti Observable/Flowable, var pārvaldīt abonēšanu un atcelt to, iznīcinot View.

    // Prezentētājā
    private var disposable: Disposable? = null
    
    fun loadData() {
        disposable = model.getData()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ data ->
                view?.showData(data) // Null pārbaude
            }, { error ->
                view?.showError(error) // Null pārbaude
            })
    }
    
    fun detachView() {
        disposable?.dispose() // Atteikšanās, iznīcinot View
        view = null // Atslēgt saiti
    }
    
  • Atpakaļsaites ar View pārbaudi: Nodot kā atpakaļsaiti objektu, kas iekšēji pārbauda, vai View pastāv, pirms veikt darbību.

    // Prezentētājā
    fun processData(data: Data) {
        val uiCallback = object : UICallback {
            override fun onSuccess(result: Result) {
                view?.showResult(result) // Null pārbaude
            }
            override fun onError(error: Throwable) {
                view?.showError(error) // Null pārbaude
            }
        }
        model.doAsyncOperation(data, uiCallback)
    }
    
    // View
    interface UICallback {
        fun onSuccess(result: Result)
        fun onError(error: Throwable)
    }
    
  • Dzīves cikla apzināmas komponentes: Izmantot komponentes, kas ir apzināmas par dzīves ciklu (piemēram, Android arhitektūras komponentu LifecycleObserver), lai automātiski atceltu pieprasījumus, mainoties View stāvoklim.

    // Prezentators, kas ir LifecycleObserver
    class MyPresenter(private val view: MyView) : LifecycleObserver {
    
        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun onDestroy() {
            // Atcelt operācijas, kad View tiek iznīcināts
        }
    
        // ...
    }
    
    // View
    lifecycle.addObserver(presenter)