Middle
Какви механизми могат да се използват за отменяне на заявки от presenter към view?
sobes.tech AI
Отговор от AI
- Мъртва View: Презентърът не държи пряка препратка към View, а я получава чрез интерфейс в момента на извикване на метода. Ако View вече не съществува, извикването просто не се случва.
- Флагове за състояние: В View може да се съхранява флаг, който показва дали е активна. Преди да извърши действие, изискващо View, презентърът проверява този флаг.
- Отписване от RxJava: Ако за взаимодействие се използват Observable/Flowable, може да се управлява абонаментът и да се отписва при унищожаване на View.
// В презентъра
private var disposable: Disposable? = null
fun loadData() {
disposable = model.getData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ data ->
view?.showData(data) // Проверка за null
}, { error ->
view?.showError(error) // Проверка за null
})
}
fun detachView() {
disposable?.dispose() // Отписване при унищожаване на View
view = null // Нулиране на препратката към View
}
- Обратен повикване с проверка на View: Да се предава като обект, който вътре проверява съществуването на View преди да изпълни действието.
// В презентъра
fun processData(data: Data) {
val uiCallback = object : UICallback {
override fun onSuccess(result: Result) {
view?.showResult(result) // Проверка за null
}
override fun onError(error: Throwable) {
view?.showError(error) // Проверка за null
}
}
model.doAsyncOperation(data, uiCallback)
}
// В View
interface UICallback {
fun onSuccess(result: Result)
fun onError(error: Throwable)
}
- Компоненти, осъзнати за жизнения цикъл: Използване на компоненти, които са осъзнати за жизнения цикъл (например, LifecycleObserver в архитектурните компоненти на Android), за автоматично анулиране на заявки при промяна на състоянието на View.
// В презентъра, който е LifecycleObserver
class MyPresenter(private val view: MyView) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
// Анулиране на операции при унищожаване на View
}
// ...
}
// В View
lifecycle.addObserver(presenter)