我有一个应用程序,其中允许用户登录。用户数据保存在数据库中。MainActivity实现了一个接口OnUserCreationCallback。
class MainActivity implements OnUserCreationCallback {
//Unrelated code
@Override
void setUser(boolean created) {
if(created) {
//Display welcome message
}
}
}
一旦用户在数据库中被创建,那么 setUser()
方法启动,用户收到一条欢迎信息。这和预期的一样。我的问题是,实现一个ViewModel和一个LiveData,当用户被创建时,可以观察到它们的真正好处吗?我说的只是这个特定的操作,而不是多次改变的操作。这是一个一次性的操作。
是的,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套件。
如果你在活动被销毁后还保留着回调,这有可能会泄露你的活动。例如,如果你在更改配置的过程中保留了你的用户仓库或其他什么东西,它将继续引用回调,即活动,而它永远不会真正被销毁。
LiveData
另一方面,它是有生命周期意识的,会根据它所注册的生命周期所有者来取消订阅,例如当活动被销毁时。
另一个人发的观点也非常好。这基本上就是MVP与MVVM之争。