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

问题描述 投票:2回答: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个回答
1
投票

documentation for LiveData中讨论:

使用LiveData的优点

使用LiveData具有以下优点:

确保您的UI符合您的数据状态

LiveData遵循观察者模式。生命周期状态更改时,LiveData会通知Observer对象。您可以巩固您的代码以更新这些Observer对象中的UI。而不是更新用户界面每次更改应用数据时,您的观察者就可以更新每次更改用户界面。

无内存泄漏

观察者绑定到生命周期对象,并在销毁它们相关的生命周期后自行清理。

没有因停止的活动而崩溃

[如果观察者的生命周期处于非活动状态,例如在后台堆栈中有活动,则它不会收到任何LiveData事件。

不再进行手动生命周期处理

UI组件仅观察相关数据,而不会停止或继续观察。 LiveData可以自动管理所有这些在观察的同时了解相关生命周期状态的变化。

总是最新数据

如果生命周期变为非活动状态,它将在再次处于活动状态时接收最新数据。例如,后台在返回到前景。

正确的配置更改

如果由于配置更改(例如设备旋转)而重新创建活动或片段,则它会立即收到最新的可用数据。

共享资源

您可以使用单例模式扩展LiveData对象以包装系统服务,以便可以在您的应用程序中共享它们。的LiveData对象一次连接到系统服务,然后再连接到需要资源的观察者只能观看LiveData对象。有关更多信息,请参见扩展LiveData。


1
投票

是:

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套件


0
投票

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

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