问题标签 [android-architecture-components]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
3789 浏览

android - LiveData 是抽象的 android

我尝试初始化我的 LiveData 对象,它给出了错误:“LiveData 是抽象的,它不能被实例化”

LiveData listLiveData = new LiveData<>();

0 投票
2 回答
1324 浏览

android - 在android中使用Room时如何在运行时重新创建SQLite数据库

我想核对数据库并在运行时重新创建它。我在基本活动中使用它来核对数据库,它成功地做到了 deleteDatabase(AppDatabase.getDATABASE_NAME());

然后我使用以下代码清除所有返回堆栈并打开启动活动

现在,当我尝试通过 Room 插入数据库时​​,它会引发以下错误

0 投票
1 回答
1267 浏览

java - 初始化 ViewModelFactory

据我了解,如果您的 ViewModel 类在其构造函数中具有参数,则 ViewModelFactory 类是必需的。除了使用依赖注入之外,我如何在我的活动中初始化我的 ViewModelFactory 类?下面是我的工厂课

这是我的活动课

0 投票
1 回答
1545 浏览

android - Android Room 重新查询数据库更改

我正在使用最新的房间持久性库编写应用程序。该应用程序简单地显示项目列表并随着数据更改更新此列表。

当新项目插入表或更新时,我希望列表自动更新。

我试过香草LiveDataFlowable到目前为止。两者都声称支持此功能,如文档和此博客中所述: https ://medium.com/google-developers/room-rxjava-acb0cd4f3757

这是ViewModelKotlin 中的代码片段:

在其他地方,数据库被修改如下:

更新不会推送给观察者。我想我错过了一些东西,但是什么?

更新:此问题已解决,答案如下。

0 投票
1 回答
1205 浏览

android - 在 ViewModel 中更改 LiveData 以“重做”工作

所以,我刚刚开始尝试LiveData- 我正忙于一个新项目,我正在使用的地方ViewModel以及LiveData-RESTFul我用来获取数据的一些服务,它们不带参数并返回一些数据。

MVVM 范例的典型设置LiveData如下所示:

现在,当我们离开这个活动,去一个新的活动,通过使用意图或其他方式,而不是按下后退按钮(所以,finalize没有被调用) - 然后回到MyActivity- 我们当然不获取users再次,因为我们仍然应该拥有该数据。

但是,如果我们确实想再次获取它们怎么办?

从我所看到的来看,正确执行此操作的唯一方法似乎是在getUsers() LiveData对象上调用“setValue”

像这样的东西:

ViewModel看起来像这样:

我决定这样做的一个原因是因为谷歌不希望我们这样做:

为此原因:

如果这是实现,则 UI 需要在每次调用 getPostalCode() 时从以前的 LiveData 中注销并重新注册到新实例。此外,如果重新创建 UI,它会触发对 repository.getPostCode() 的另一个调用,而不是使用先前调用的结果。

有没有更好的方法来ViewModel“重做”它的repo.getUsers()调用?也许我可以创建一个方法,说“Update()”而不是“活动”,但仍然 - 它以不同的方式做同样的事情。

0 投票
12 回答
66226 浏览

android - Android 房间持久性库:Upsert

Android 的 Room 持久性库优雅地包含了适用于对象或集合的 @Insert 和 @Update 注释。但是,我有一个需要 UPSERT 的用例(包含模型的推送通知),因为数据库中可能存在也可能不存在数据。

Sqlite 本身没有 upsert,在这个SO question中描述了解决方法。鉴于那里的解决方案,如何将它们应用于 Room?

更具体地说,如何在 Room 中实现不会破坏任何外键约束的插入或更新?使用带有 onConflict=REPLACE 的 insert 将导致调用该行的任何外键的 onDelete。在我的情况下,onDelete 会导致级联,重新插入一行将导致其他表中具有外键的行被删除。这不是预期的行为。

0 投票
1 回答
140 浏览

android - 在新的 Android 生命周期架构组件中,是否可以在不进行注释处理的情况下观察生命周期事件?

注释处理/代码生成会显着增加构建时间并破坏增量构建。

Lifecycle.Event.ON_STOP我可以(被动地,也就是不通过手动转发事件)获得使用Android 生命周期架构组件的细粒度回调吗?

或者如果我选择不使用注释处理,这是否使用反射(慢)?

0 投票
0 回答
1517 浏览

android - Android架构组件和LiveData,太多的MutableLiveData对象?

在 android 架构组件发布之前,我开始从事一个项目,我拥有自己的 ViewModel,它与 Fragment 具有相同的生命周期,并且 ViewModel 状态保存在 Loader 内的 StateObject 中,以便状态可以在方向变化后继续存在。ViewModel 通过接口与 Fragment 通信。这很好用,因为 ViewModel 和 Fragment 具有相同的生命周期。我的 ViewModel 包含各种状态。它有一个 isLoading 布尔值、isEmptyStateVisible 布尔值等。每次状态发生变化时,我都会调用 view.notifyIsLoadingChanged(true/false) 之类的东西,在这种情况下,Fragment 会显示或隐藏一个微调器。

现在我将更改我的实现以将新的 ViewModel 与 LiveData 一起使用。实现 LiveData 的最快方法是更改​​ ViewModel 正在使用的 UI 界面的实现。所以我可以保留我当前的实现,只添加这个 UI 接口实现:

此类扩展的 LiveDataUI 类具有更多方法,例如:

有了这个实现,我最终会得到很多 MutableLiveData 对象,而且感觉不对。我是否在我的 ViewModel 中投入了太多的状态?我的想法是将所有逻辑都包含在 ViewModel 中,这样我就可以编写测试来验证在加载数据时 isLoading 是否为真,如果 Api 没有返回数据,则 isEmptyState 为真等。

我还注意到,如果我调用 setValue(state); 在同一个 MutableLiveData 对象上很短的时间内多次,onChanged 方法只被调用一次。那是对的吗?

0 投票
1 回答
10179 浏览

android - Android LiveData Observer 首次更新后未激活

我正在尝试使用 Kotlin 对架构组件的实时数据进行基本实现,如下所示:

我的 ViewModel 类是这样创建的:

和我的存储库:

}

所有这些都非常有效,并且 UI 已按应有的方式更新,但只是第一次。如果我尝试手动调用从 UI 操作更新 viewModel,改造调用仍按预期工作,但新数据不会发送到 Fragment 中的观察者:

观察者在第一次触发后变为非活动状态是预期的行为吗?

0 投票
1 回答
4512 浏览

android - MVVM Dagger2 组件中存在匹配键的绑定

我正在使用以下 google 示例项目:https ://github.com/googlesamples/android-architecture-components作为我的新项目的参考,并且在尝试向项目添加第二个活动时遇到困难。

这是我在编译时遇到的错误

这是我的代码

活动模块

应用组件

应用程序注入器

应用模块

FragmentBuilders 模块

可注射的

视图模型键

视图模型模块

应用

导航控制器

主要活动

联系活动