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

Android 使用LiveData而不是常规回调有什么好处吗?,android,android-livedata,android-architecture-components,android-viewmodel,Android,Android Livedata,Android Architecture Components,Android Viewmodel,我有一个允许用户登录的应用程序。用户数据保存在数据库中。Main活动实现OnUserCreationCallback接口: class MainActivity implements OnUserCreationCallback { //Unrelated code @Override void setUser(boolean created) { if(created) { //Display welcome message

我有一个允许用户登录的应用程序。用户数据保存在数据库中。Main活动实现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是一种使用观察者进行异步编程的方法。从本地数据库到视图,您可以观察实时数据或使用协程来获取数据,结果是相同的,您必须判断何时最好在协程内获得结果,何时最好有一个观察者

我这样说是因为您不需要ViewModel,它是Jetpack的一部分,但是如果DAO返回LiveData,那么您可以直接从视图中观察(顺便说一句,这将是糟糕的体系结构),或者您可以使用演示者

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

     @Query(/*SELECT ALL*/)
     fun getAll(): LiveData<List<Entity>>

}
@Dao
接口实体DAO{
@查询(/*全选*/)
suspend fun getAll():列表
@查询(/*全选*/)
fun getAll():LiveData
}
还有其他一些功能,对于测试实时数据,您需要一些助手方法或使用espresso,但是对于测试挂起功能,您可以使用robo electric或runBlockingTest套件