首页 > 解决方案 > Android MVP 我应该在哪里有一个 TextWatcher

问题描述

我目前TextWatchers在我的视图文件(activity.java)上实现了我的实现。但是它们应该在演示者中,因为演示者是在用户输入后决定做什么的人,还是将它们留在原处是否明智?

标签: javaandroidandroid-mvp

解决方案


您的问题有两个方面:

  • 一方面,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被垃圾收集而产生任何泄漏)


推荐阅读