问题标签 [android-architecture-lifecycle]

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 投票
1 回答
532 浏览

android - Observer 和 LifecycleObserver 有什么区别?

我正在努力理解对象在方法中接收到的LiveDataaLifecycleObserver和 the之间的区别。ObserverLiveDataobserve()

我说的LiveData是正确的LifecycleObserver,所以它知道Activity因为它吗?

并且方法中Observer收到的内容与此observe()无关,LifecycleObserver因为它只是在onChange()发生更改时执行该方法LiveData

0 投票
1 回答
1829 浏览

android - 活动恢复后,Room Livedata.observeforever 不工作

我已经使用如下简单的 Room 测试代码测试了一些测试用例。主要活动恢复后,“dao.getAll().observeForever()”不起作用。新词插入正确,但只有观察不起作用。如果我使用 dao.getAll().observe(),它总是可以正常工作。不允许在活动的 onCreate() 方法上使用 observeForever 吗?

应用数据库.java

}

Word.java

}

WordDao.java

}

MainActivity.java

构建.gradle

0 投票
6 回答
8493 浏览

android - 如何为 android 架构组件生命周期事件添加单元测试?

我尝试为支持架构组件生命周期事件的函数添加单元测试。为了支持生命周期事件,我@OnLifecycleEvent为我的函数添加了注释,当该事件发生时我想做一些事情。

一切都按预期工作,但我想为该函数创建一个单元测试,以检查我的函数在预期事件发生时是否运行。

我试图模拟 LifecycleOwner 并创建新的 LifecycleRegistery 来更改生命周期观察者的状态,但我没有这样做。

如何测试onClear()状态更改时调用的函数?

0 投票
0 回答
497 浏览

android - 带有 Dagger 2 的 Android Java ViewModel

我正在尝试将 viewmodel 与 dagger 2 一起使用。
但是,在方向更改时,ViewModel正在重新创建。我SwipeRefreshLayout NullPointerException上车featuredViewModel.getLoading.observe()
我的失败在哪里?

Dagger 2 Fragment 模块(贡献AndroidInjector)

视图模型片段

分段

编辑:我是这样注射的

谢谢..

0 投票
2 回答
70 浏览

android - 生命周期感知 Codelab 概念

我正在从 Chronometer 示例开始的 Codelab 中学习 Lifecycle Aware Components。在第 2 步中,我有疑问。这些是供参考的代码文件

ChronoActivity2.java

ChronometerViewModel.java

在上面的代码中,我们只在第一次创建 ViewModel 时调用setTime() ,即在完全关闭后启动应用程序时。只有setTime()方法应该更新 Long 变量mStartTime。在活动文件结束时,我们调用start()方法,该方法应该开始计时码表的计数。

怀疑:

如果我们在应用程序的生命周期而不是 Activity 期间只调用一次 set 方法,从else部分可以看出,Long 变量 mStartTime 的值是如何更新的,我们是否将 Chronometer 的基础设置为变量。start()返回的值与变量没有任何关系,因此setTime()函数如何每秒一次又一次地被调用。

0 投票
1 回答
186 浏览

android - Android ViewModel 设计/架构

我是一名 android 初学者,只是在寻找一些关于应用程序架构的建议——特别是与使用 ViewModels 相关的建议。没有本地数据库,每个屏幕都会发出一个新的网络请求。我稍后会考虑实现房间或类似的东西。

主要活动(电影列表)

我有一个 100% 大小的回收视图显示电影列表的活动,recyclerview 中的每部电影都有一个封面图像,用户可以触摸该封面图像以导航到播放器视图。MainActivity(和它的回收器视图)由 ViewModel 支持。Movie 对象(由 LiveData 包装)具有您所期望的内容,例如标题、类别、封面图片、mp4 文件的 url。

为了转换到 PlayerActivity,intent 将所选电影的 ID 作为额外的字符串传递。

玩家活动

当 MainActivity 的回收器视图中的一个电影单元被选中时,我创建了一个新的意图来转换到播放电影的 PlayerActivity。这里也有一个带有电影封面图像的 imageView。此视图也由 ViewModel 支持。

在 OnCreate() 中,我从意图中额外获取了 movie_id 字符串,并创建了 ViewModel(并且 ViewModel 使用 movie_id 执行网络请求)。这个视图还有一个按钮,当被触摸时,用户会跳转到一个 ScreenshotActivity。转换到 ScreenshotActivity 的意图也将 movie_id 作为额外的字符串传递。

截图活动

具有显示的电影屏幕截图的回收视图,当被触摸时,网络请求被发送回服务器以使用其中一个屏幕截图更新电影的封面图像。此活动从 PlayerActivity 意图中获取额外的 movie_id 来设置视图。

问题

  1. 每次进行网络请求显然是非常浪费的,我知道我应该使用类似空间之类的东西在本地缓存这些信息。在没有本地数据库的情况下,有没有更好的方法来做我上面用 ViewModels 做的事情?也许上面所有 3 个活动都可以访问一个视图模型?这样做,可以直接对电影对象进行更改并在所有视图中同步吗?关于如何做到这一点的任何好例子?
  2. 鉴于我当前用于 3x 活动的 3x ViewModels,当 ScreenshotActivity 中的屏幕截图更新时,如何通知 MainActivity 更新屏幕截图,并通知 PlayerActivity 更新封面图像(在播放器上)?
0 投票
0 回答
822 浏览

android - Android ViewModel 在 Fragment 之间共享

我的团队刚刚开始将我们的应用程序转换为在 Android 中使用 ViewModels,需要一些帮助。我们的应用程序有一组显示在片段中的建筑物。您可以在列表中选择一个建筑物以查看有关该建筑物的详细信息片段。

我们正在尝试使用此处建议的方式(将 ViewModel 绑定到活动)在片段之间共享数据: https ://developer.android.com/topic/libraries/architecture/viewmodel#sharing

我们的 BuildingViewModel 具有建筑物的主列表和详细记录。BuildingCollectionFragment 在 masterList 上有一个观察者,而 BuildingDetailFragment 在 detail 对象上有一个观察者。

我们遇到的问题是建筑物可以在 DetailFragment 上有相关的建筑物,您可以导航到这些建筑物。当您在相关建筑物的详细列表中选择建筑物时,我们在过渡到新的 BuildingDetailFragment 之前调用以下代码

这效果很好!

问题

问题是当我们按下返回按钮时,仍然绑定到活动的 ViewModel 仍然认为我们在按下返回按钮之前正在查看的建筑物仍然处于活动状态。我们希望只使用现有列表,而不必返回并从 API 获取数据

0 投票
0 回答
1704 浏览

android - ViewModel、Room、LiveData、RecyclerView 过滤数据

我正在开发基于架构组件(ViewModel/Room/Livedata)和 RecyclerView 的库存应用程序。该应用基于 Google 在开发人员培训书中推荐的做法。
高级 Android 开发课程 - 使用架构组件:Room、LiveData、ViewModel

该应用程序具有相当复杂的数据模型,它实现为 Room 实体和关系(10 多个表、外键等)。我也有相应的 DAO。

主要活动是要使用的项目列表的 RecyclerView,当用户单击其中一个项目时,会打开一个特殊的子活动,用户必须输入保存到房间中的项目相关数据。当用户返回到由于 LiveData 刷新的 MainActivity 数据时。由于 ViewModel,配置更改也有效。

应用程序的工作流程如下:

  1. 用户从服务器下载数据,创建 Room DB,MainActivity 显示要使用的项目列表
  2. 用户浏览项目,单击其中一个,打开一个特定于项目的子活动,用户在其中记录其保存到 Room 中的数据
  3. 当所有物品完成用户将物品记录数据上传到服务器时,房间中的数据被删除,用户可以下载新的物品列表
  4. 用户不能删除或插入新项目,他只能将其数据记录在相应的子活动中。下载数据时删除/插入的项目。

我想要的是过滤 MainActivity 的 RecyclerView 上的项目列表。

Google 和 Stackowerflow 的帖子推荐使用 Livedata 的 switchmap 进行过滤。
最佳实践:使用 Room 和 LiveData
Android Room LiveData 选择查询参数的运行时过滤器

我不喜欢这种方法,因为

  1. 我必须去 Room 并在新的 AsyncTask 中查询数据
  2. Room 不提供基于复杂过滤器模型的综合查询

    /li>

FilterDataPOJO在哪里。

相反,我必须写

我的计划如下

  1. 用户在FilterActivity中指定FilterData
  2. 当 FilterActivity 完成时

    /li>
  3. 在 RecyclerView 的适配器中

    /li>

因此,将所有数据保留在 LiveData 中,当用户过滤时,然后用过滤列表填充 RecyclerView 的适配器并通知更改。

以这种方式过滤是否正确?它有什么陷阱吗?

0 投票
2 回答
3643 浏览

android - 我是否需要在其 onDestroy() 事件时调用 removeObserver 的生命周期?

这是一个非常简单的问题:

背景

我正在使用相对较新的Lifecycle 类android 架构组件库的一部分)以更简单的方式处理一些事件Activity/Fragment

这是您使用它来处理ON_DESTROY事件的方式:

问题

我在文档和这里都找不到,无论我应该打电话removeObserver还是在ON_DESTROY事件时自动完成。

我试过的

我试图阅读它,现在作为预防措施,我总是打电话给removeObserver.

问题

避免调用removeObserverON_DESTROY事件是否安全?

0 投票
1 回答
106 浏览

android - 无法信任 AAC 生命周期的当前状态

问题摘要

getLifecycle().getCurrentState()给了我错误的状态。

环境(集成库、操作系统等)

  • compileSdkVersion:27
  • targetSdkVersion : 27
  • 支持库:27.1.1

预期行为

  • onCreate() -> 已创建
  • onStart() -> 开始
  • onResume() -> 恢复
  • onPause() -> 开始
  • onStop() -> 已创建
  • onDestroy() -> 销毁

实际行为

  • onCreate :初始化
  • onStart :已创建
  • onResume :开始
  • onPause : 开始
  • onStop : 已创建
  • onDestroy : 销毁

问题详情

我尝试使用下面的代码。我搜索了谷歌,但没有人对此感到奇怪。我是不是少了点什么?