使用LiveData而不是普通的回调有什么好处吗?

问题描述 投票:3回答:3

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

class MainActivity implements OnUserCreationCallback {
    //Unrelated code

    @Override
    void setUser(boolean created) {
        if(created) {
            //Display welcome message
        }
    }
}

一旦用户在数据库中被创建,那么 setUser() 方法启动,用户收到一条欢迎信息。这和预期的一样。我的问题是,实现一个ViewModel和一个LiveData,当用户被创建时,可以观察到它们的真正好处吗?我说的只是这个特定的操作,而不是多次改变的操作。这是一个一次性的操作。

android android-livedata android-architecture-components android-viewmodel
3个回答
2
投票

是的,Livedata是有生命周期意识的。

Livedata是有生命周期意识的。

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

在你的案例中,这可以防止用户退出应用,并因为主机不存在而得到一个空指针异常。在更复杂的情况下,它可以帮助你更好地协调事件。

LiveData是一种使用观察者进行异步编程的方式。从本地db到View,你可以观察一个实时数据,也可以用Coroutine来获取数据,结果是一样的,你要判断什么时候在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,但是对于测试suspend函数,你可以使用robo electric或者runBlockingTest套件。


1
投票

如果你在活动被销毁后还保留着回调,这有可能会泄露你的活动。例如,如果你在更改配置的过程中保留了你的用户仓库或其他什么东西,它将继续引用回调,即活动,而它永远不会真正被销毁。

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

另一个人发的观点也非常好。这基本上就是MVP与MVVM之争。

© www.soinside.com 2019 - 2024. All rights reserved.