我有一个允许用户登录的应用。用户数据保存在数据库中。 MainActivity实现一个接口OnUserCreationCallback:
class MainActivity implements OnUserCreationCallback {
//Unrelated code
@Override
void setUser(boolean created) {
if(created) {
//Display welcome message
}
}
}
一旦在数据库中创建了用户,就会触发setUser()
方法,并且用户会收到一条欢迎消息。这正在按预期方式工作。我的问题是,实现ViewModel和LiveData是否有任何真正的好处,在创建用户时可以观察到?我只是在说这个特定的操作,而不是在多次更改的操作。这是一次操作。
在documentation for LiveData中讨论:
使用LiveData的优点
使用LiveData具有以下优点:
确保您的UI符合您的数据状态
LiveData遵循观察者模式。生命周期状态更改时,LiveData会通知Observer对象。您可以巩固您的代码以更新这些Observer对象中的UI。而不是更新用户界面每次更改应用数据时,您的观察者就可以更新每次更改用户界面。
无内存泄漏
观察者绑定到生命周期对象,并在销毁它们相关的生命周期后自行清理。
没有因停止的活动而崩溃
[如果观察者的生命周期处于非活动状态,例如在后台堆栈中有活动,则它不会收到任何LiveData事件。
不再进行手动生命周期处理
UI组件仅观察相关数据,而不会停止或继续观察。 LiveData可以自动管理所有这些在观察的同时了解相关生命周期状态的变化。
总是最新数据
如果生命周期变为非活动状态,它将在再次处于活动状态时接收最新数据。例如,后台在返回到前景。
正确的配置更改
如果由于配置更改(例如设备旋转)而重新创建活动或片段,则它会立即收到最新的可用数据。
共享资源
您可以使用单例模式扩展LiveData对象以包装系统服务,以便可以在您的应用程序中共享它们。的LiveData对象一次连接到系统服务,然后再连接到需要资源的观察者只能观看LiveData对象。有关更多信息,请参见扩展LiveData。
是:
Livedata具有生命周期意识。
这意味着,如果片段被分离或用户退出应用程序,观察者也将分离。
在您的情况下,由于主机不存在,可能阻止用户退出应用程序并获得空指针异常。在更复杂的情况下,它将帮助您更好地协调事件。
LiveData是使用观察者进行异步编程的一种方法。从本地数据库到View,您可以观察实时数据或使用协程获取数据,结果是相同的,您必须判断何时更好地在协程内部获得结果,或何时更好地具有观察员。 >
我在上面说是因为您不需要ViewMode,它是jetpack的一部分,但是如果您的DAO返回LiveData,那么您可以直接从View观察(这可能是糟糕的体系结构),也可以使用Presenter。
@Dao interface EntityDao { @Query(/*SELECT ALL*/) suspend fun getAll(): List<Entity> @Query(/*SELECT ALL*/) fun getAll(): LiveData<List<Entity>> }
还有其他影响,要测试实时数据,您需要某种辅助方法或使用浓缩咖啡,但要测试暂停功能,您可以使用robo electric或runBlockingTest套件
如果在活动销毁后保留回调,很有可能会泄漏您的活动。例如,如果您在配置更改期间保留用户存储库或任何其他内容,它将继续引用回调(即活动),并且永远不会真正销毁它。