有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有状态变量的java MVP模式Android Avoid presenter

我正在开发一个Android应用程序,我正在对几个月前就已经存在的一个类进行重构,我在presenter上遇到了一个问题,他们存储了一个服务的响应

private lateinit var itemDetail : ItemDetail

它可以工作,你可以测试它,但我不喜欢这种方式,因为你必须做一个“黑客”来测试它。假设我的演示者有这些方法

interface Contract {

  interface Presenter { 
     fun onViewReady(itemId: String)
     fun onButtonTap()
  }

  interface View { 


  }

}

然后,当打开DetailActivity时,我会presenter.onViewReady(itemId)并在演示者中调用细节项。 当点击按钮并执行presenter.onButtonTap()时会出现问题。我确实需要知道此项的类型,并且此信息在第一次调用的结果中onViewReady(),因此我理解presenter上的存储变量,因此我可以执行以下操作:

...
override fun onButtonTap() {
  if(::itemDetail.isInitialized()){... do something with model}
}

但是当测试它时,如果我只想测试onButtonTap,我需要执行完整的流程来存储这个变量,然后能够从该对象获取属性并避免NPE

我想既然我有了我的getItemDetailUseCase(itemId: String),我可以重新调用服务,这样测试就更容易了,我可以避免演示者中的变量,但性能不好

我还想过创建一个“存储库模式”,在那里我有一个“真相的来源”,但我看到了这种过分的杀伤力,因为这是哪种缓存?我不想将其存储在SharedReferences(Android的内部存储)或Room(Android数据库)中

另一个选择是这样做

internal interface ItemDetailDataSource {
    fun retrieveItemDetail(): ItemDetail?
    fun storeItemDetail(itemDetail: ItemDetail)
    fun removeItemDetail()
}

@Singleton
internal class ItemDetailCacheDataSourceImpl : ResourcesCacheDataSource {

    private var itemDetail: ItemDetail? = null

    override fun retrieveItemDetail(): ItemDetail? {
        return itemDetail
    }

    override fun storeItemDetail(itemDetail: ItemDetail) {
        this.itemDetail = itemDetail
    }

    override fun removeItemDetail() {
        itemDetail = null
    }
}

但这是不安全的,因为Android可以在需要空间的时候删除这个类,同样的情况也会发生

你理想的方法是什么


共 (0) 个答案