【问题标题】:Android MVP: Handling all exceptions inside a presenter classAndroid MVP:处理演示者类中的所有异常
【发布时间】:2020-01-28 19:16:00
【问题描述】:

我正在 MVP 架构中实现一个 android 应用程序。

我在我的演示者中保留对视图的引用,并执行耗时的任务,例如从我的模型中的网络加载。

我的问题是,在我想要调用 View 方法的演示者内部的每个调用中,视图可能已经被破坏并且它的引用在演示者内部设置为 null。

所以当我收到模型的结果时,在像mView.updateUISomehow() 这样的每个调用之前需要添加if (mView!=null),因为当控制达到这一点时,mView 可能会为空。

我想知道是否有任何方法可以跳过所有 null 检查并在类范围的异常处理程序中处理演示者类的所有可能异常。

P.S. 我知道 MVVM、LiveData 和 Room。我想解决这个确切的问题:)

【问题讨论】:

  • 您已经知道 MVVM 是推荐的方式,但是您想仔细阅读这个!您可以为演示者创建一个超类,它应该有一个 UiUpdate() 方法来检查关联视图是否为空,因此基本解释器类的子类不必
  • @PankajNimgade 是否有任何其他方法或库来实现 MVVM 而不使用 LiveData 和 Room 来处理生命周期本身?这很奇怪,但不知何故我不喜欢 LiveData 和 Room! :D
  • 哈哈哈,我希望我能说你不是第一个这么说的人。有些人已经这样做了,但我认为这将是重新发明轮子。然而这是可能的。
  • 如果您不喜欢 LiveData 和 Room,您可能不喜欢其他库。但你可以试试 RxAndroid for VM 和 Realm for database

标签: android exception nullpointerexception android-mvp


【解决方案1】:
BasePresenter<View>{
  View view

  updateUI(){
   if(view != null)
      callUI()
  }

  abstract callUI();
}

你的控制器会知道updateUI(),你可以选择如何处理它

YourPresenter<ThatElusiveview> extends BasePresenter<ThatElusiveEview>{


  callUI(){
   // hoping this is not directly called from the controller!!
  } 
}

我在使用 MVP 时遇到了同样的问题,但在实际场景中会发生太多 UI 更新调用。对 Jet pack 的重构做得很好。我理解你的困境。 我相信如果你为 Presenter 提供监听器来查看是可行的,所以如果视图被破坏,Presenter 将保持从控制器到 View 的通信。

听起来确实像检查视图!= null,但是您可以枚举从演示者到视图的不同类型的更新。您可以将其放在一个地方进行检查,然后根据枚举操作的类型将它们引导到相应的更新方法。 这也将有助于阅读有关演示者能够发送到视图的不同操作的代码

【讨论】:

  • 问题是我有很多 updateUI() 方法,例如 hideProgressBar()、showList()、updateList() 等。所以很难检查每个 null 和超类的用法帮助不大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多