java - Android MVP 我应该在哪里有一个 TextWatcher
问题描述
我目前TextWatchers
在我的视图文件(activity.java)上实现了我的实现。但是它们应该在演示者中,因为演示者是在用户输入后决定做什么的人,还是将它们留在原处是否明智?
解决方案
您的问题有两个方面:
- 一方面,TextWatcher绝对是 Android UI 的一部分,并且由于Presenter不应该知道任何关于 Android 特定代码的信息,因此Watcher应该是视图的一部分
- 另一方面,TextWatcher需要处理传入的事件并对其应用业务逻辑,并且由于View应该尽可能地愚蠢,Watcher应该是Presenter的一部分
要解决此问题,我的建议是将Watcher保留在View中,但仅将其传入事件重定向到Presenter:
class TextWatcher(presenter: MVPWatcherInterface) : ParentTextWatcher {
private val presenterInterface: WeakReference<MVPWatcherInterface> = WeakReference(presenter)
override fun onSomeTextEvent(){
presenterInterface.get()?.onWatcherEventSomeTextEvent()
}
}
要实现这一点,您必须定义MVPWatcherInterface并在您的Presenter中实现它,并在您在View中创建它时将其传递给TextWatcher。这允许您在 Presenter 中处理onWatcherEventSomeTextEvent 中的所有业务逻辑。
这样代码是干净的并且根据 MVP 规则分离:)
(作为旁注:我建议的观察者使用Wea kReference来保留MVPWatcherInterface -> 我强烈建议以这种方式实现它,这样您的代码就不会通过防止Presenter被垃圾收集而产生任何泄漏)
推荐阅读
- r - 如何读出 R 列中 JSON 字符串的一个值?
- javascript - 方向平滑变化的随机游走
- ios - 如何在 (react-native)ios 上实现全景 url 图像查看器
- express - expressjs req.body 为空
- sql - 在逗号分隔值中查找包含相同值的行
- javascript - 在 Chrome 浏览器中单击返回按钮时返回页面问题
- python - python中的OpenGL因glCheckError调用而减慢
- android - 片段加载为 RecyclerView 适配器中的项目
- jquery - 如何在 Laravel 中使用 AJAX 从 URL 正确加载数据
- javascript - 用于 API 节点 api 应用程序的不带 cookie 和会话的 cusrf