问题标签 [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.
android - LiveData 是抽象的 android
我尝试初始化我的 LiveData 对象,它给出了错误:“LiveData 是抽象的,它不能被实例化”
LiveData listLiveData = new LiveData<>();
android - 在android中使用Room时如何在运行时重新创建SQLite数据库
我想核对数据库并在运行时重新创建它。我在基本活动中使用它来核对数据库,它成功地做到了
deleteDatabase(AppDatabase.getDATABASE_NAME());
然后我使用以下代码清除所有返回堆栈并打开启动活动
现在,当我尝试通过 Room 插入数据库时,它会引发以下错误
java - 初始化 ViewModelFactory
据我了解,如果您的 ViewModel 类在其构造函数中具有参数,则 ViewModelFactory 类是必需的。除了使用依赖注入之外,我如何在我的活动中初始化我的 ViewModelFactory 类?下面是我的工厂课
这是我的活动课
android - Android Room 重新查询数据库更改
我正在使用最新的房间持久性库编写应用程序。该应用程序简单地显示项目列表并随着数据更改更新此列表。
当新项目插入表或更新时,我希望列表自动更新。
我试过香草LiveData
,Flowable
到目前为止。两者都声称支持此功能,如文档和此博客中所述:
https ://medium.com/google-developers/room-rxjava-acb0cd4f3757
这是ViewModel
Kotlin 中的代码片段:
在其他地方,数据库被修改如下:
更新不会推送给观察者。我想我错过了一些东西,但是什么?
更新:此问题已解决,答案如下。
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()”而不是“活动”,但仍然 - 它以不同的方式做同样的事情。
android - Android 房间持久性库:Upsert
Android 的 Room 持久性库优雅地包含了适用于对象或集合的 @Insert 和 @Update 注释。但是,我有一个需要 UPSERT 的用例(包含模型的推送通知),因为数据库中可能存在也可能不存在数据。
Sqlite 本身没有 upsert,在这个SO question中描述了解决方法。鉴于那里的解决方案,如何将它们应用于 Room?
更具体地说,如何在 Room 中实现不会破坏任何外键约束的插入或更新?使用带有 onConflict=REPLACE 的 insert 将导致调用该行的任何外键的 onDelete。在我的情况下,onDelete 会导致级联,重新插入一行将导致其他表中具有外键的行被删除。这不是预期的行为。
android - 在新的 Android 生命周期架构组件中,是否可以在不进行注释处理的情况下观察生命周期事件?
注释处理/代码生成会显着增加构建时间并破坏增量构建。
Lifecycle.Event.ON_STOP
我可以(被动地,也就是不通过手动转发事件)获得使用Android 生命周期架构组件的细粒度回调吗?
或者如果我选择不使用注释处理,这是否使用反射(慢)?
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 方法只被调用一次。那是对的吗?
android - Android LiveData Observer 首次更新后未激活
我正在尝试使用 Kotlin 对架构组件的实时数据进行基本实现,如下所示:
我的 ViewModel 类是这样创建的:
和我的存储库:
}
所有这些都非常有效,并且 UI 已按应有的方式更新,但只是第一次。如果我尝试手动调用从 UI 操作更新 viewModel,改造调用仍按预期工作,但新数据不会发送到 Fragment 中的观察者:
观察者在第一次触发后变为非活动状态是预期的行为吗?
android - MVVM Dagger2 组件中存在匹配键的绑定
我正在使用以下 google 示例项目:https ://github.com/googlesamples/android-architecture-components作为我的新项目的参考,并且在尝试向项目添加第二个活动时遇到困难。
这是我在编译时遇到的错误
这是我的代码
活动模块
应用组件
应用程序注入器
应用模块
FragmentBuilders 模块
可注射的
视图模型键
视图模型模块
应用
导航控制器
主要活动
联系活动