使用LiveData而不是常规回调有什么好处吗



我有一个允许用户登录的应用程序。用户数据保存在数据库中。MainActivity实现了一个接口OnUserCreationCallback:

class MainActivity implements OnUserCreationCallback {
//Unrelated code
@Override
void setUser(boolean created) {
if(created) {
//Display welcome message
}
}
}

一旦在数据库中创建了用户,就会触发setUser()方法,并且用户会收到一条欢迎消息。这正在按预期进行。我的问题是,在创建用户时,实现ViewModel和LiveData有什么真正的好处吗?我说的只是这个特定的操作,而不是一个多次更改的操作。这是一次性手术。

如果在活动销毁后保留回调,则有可能泄露您的活动。例如,如果您在配置更改期间保留用户存储库或其他内容,它将继续引用回调,即活动,并且它永远不会真正被销毁。

另一方面,LiveData具有生命周期意识,将根据其注册的生命周期所有者取消订阅,例如当活动被销毁时。

另一个人也得到了很好的分数。这基本上就是MVP与MVVM的辩论。

是:

Livedata具有生命周期意识

这意味着,如果片段被分离或用户退出应用程序,则观察者也被分离。

在您的情况下,这可能会阻止用户退出应用程序并获得空指针异常,因为主机不存在。在更复杂的情况下,它将帮助您更好地协调事件。

LiveData是一种使用观测器进行异步编程的方法。从本地数据库到视图,你可以观察实时数据,也可以使用Coroutines来获取数据,结果是一样的,你必须判断什么时候最好在coroutine中获得结果,或者什么时候最好有一个观察者。

我之所以这么说,是因为你不需要ViewModel,它是Jetpack的一部分,但如果你的DAO返回LiveData,那么你可以直接从View中观察到这一点(顺便说一句,这将是糟糕的架构(,或者你可以使用Presenter。

@Dao
interface EntityDao {
@Query(/*SELECT ALL*/)
suspend fun getAll(): List<Entity>
@Query(/*SELECT ALL*/)
fun getAll(): LiveData<List<Entity>>
}

还有其他应用程序,对于测试实时数据,您需要一些辅助方法或使用espresso,但对于测试暂停功能,您可以使用robo-electric或runBlockingTest套件

相关内容

  • 没有找到相关文章

最新更新