问题标签 [android-architecture]

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 投票
2 回答
1121 浏览

android - 我可以将房间持久性用于不同类型的数据库吗?

我知道房间是 SQLite 上的一个抽象层,我只想知道我是否可以将它用于不同类型的数据库。我想将 Room 用于具有地理空间支持的特殊版本的 SQLite,可以吗?我真的找不到关于这个的答案。

安卓空间

提前致谢!

0 投票
5 回答
16192 浏览

android - BoundService + LiveData + ViewModel 新Android推荐架构最佳实践

我一直在努力思考将 Android Services 放置在新的Android 推荐的 Architecture中的哪个位置。我想出了许多可能的解决方案,但我无法决定哪一个是最好的方法。

我做了很多研究,但找不到任何有用的指南或教程。我发现的关于在我的应用程序架构中放置服务的唯一提示是这个,来自@JoseAlcerreca Medium 帖子

理想情况下,ViewModel 不应该对 Android 有任何了解。这提高了可测试性、泄漏安全性和模块化。一般的经验法则是确保您的 ViewModel 中没有 android.* 导入(android.arch.* 等例外情况除外)。这同样适用于演讲者。

据此,我应该将我的 Android 服务放在架构组件层次结构的顶部,与我的活动和片段处于同一级别。那是因为 Android 服务是 Android 框架的一部分,所以 ViewModel 不应该知道它们。

现在,我将简要解释一下我的场景,但只是为了让全景更清晰,而不是因为我想要这个特定场景的答案。

  • 我有一个 Android 应用程序,它有一个 MainActivity,里面有很多片段,所有这些片段都捆绑在一个 BottomNavBar 中。
  • 我有一个绑定到 myActivity 及其片段之一的 BluetoothService(因为我希望服务具有与 Activty 相同的生命周期,但我也想直接从我的片段与其交互)。
  • 该片段与 BluetoothService 交互以获取两种类型的信息:
    • 有关蓝牙连接状态的信息。不需要坚持。
    • 来自蓝牙设备的数据(它是一个秤,在这种情况下是体重和身体成分)。需要坚持。

以下是我能想到的 3 种不同的架构:

AndroidService 中的 LiveData

更新:这是我个人当时采用的方法,因为它运作良好,让我能够相对快速地完成它。但是,我建议遵循 Jeel Vankhede 的更新答案,以获得似乎更“惯用”的实现。

Android 服务架构中的 LiveData

  • 带有连接状态和来自蓝牙设备的重量测量值的 LiveData 在 BluetoothService 中。
  • Fragment 可以触发 BluetoothService 中的操作(例如 scanDevices)
  • Fragment 观察有关连接状态的 LiveData 并相应地调整 UI(例如,如果状态为连接,则启用按钮)。
  • Fragment 观察新体重测量的 LiveData。如果来自 BluetoothDevice 的新重量测量值,则 Fragment 会告诉它自己的 ViewModel 保存新数据。它是通过 Repository 类完成的。

在 Fragment 和 AndroidService 之间共享 ViewModel 共享 ViewModel 拱门

  • Fragment 可以触发 BluetoothService 中的操作(例如 scanDevices)
  • BluetoothService 更新共享 ViewModel 中的蓝牙相关 LiveData。
  • Fragment 在自己的 ViewModel 中观察 LiveData。

服务视图模型 服务视图模型拱

  • Fragment 可以触发 BluetoothService 中的操作(例如 scanDevices)
  • BluetoothService 在自己的 ViewModel 中更新与蓝牙相关的 LiveData。
  • Fragment 在自己的 ViewModel 和 BluetoothService ViewModel 中观察 LiveData。

我很确定我应该将它们放在架构之上,并将它们视为 Activity/Fragment,因为 BoundServices 是 Android 框架的一部分,它们由 Android 操作系统管理,并且绑定到其他 Activity 和 Fragment。在这种情况下,我不知道与 LiveData、ViewModel 和活动/片段交互的最佳方式是什么。

有些人可能认为它们应该被视为数据源(因为在我的例子中,它是使用蓝牙从秤中获取数据),但我认为这不是一个好主意,因为我在上一段中说过特别是因为它在这里说的

避免将应用程序的入口点(例如活动、 服务和广播接收器)指定为数据源。相反,它们应该只与其他组件协调以检索与该入口点相关的数据子集。每个应用程序组件的寿命都很短,具体取决于用户与其设备的交互以及系统当前的整体健康状况。

所以,最后,我的问题是:

我们应该将我们的 Android(绑定)服务放在哪里,它们与其他架构组件的关系是什么?这些替代方案中的任何一个都是好方法吗?

0 投票
1 回答
99 浏览

android - 为什么是 todo-mvp-dagger,而不是 todo-mvvm-dagger?

https://developer.android.com/topic/libraries/architecture/

在Android架构蓝图中,为什么dagger是基于mvp架构而不是MVVM架构?是不是因为不适合MVVM架构?还是其他原因?

0 投票
1 回答
2669 浏览

java - 如何在模块化 Android 应用程序中共享依赖项

我有一个以模块化方式构建的 Android 项目。我遵循干净的体系结构,通过在多个 Gradle 模块之间划分它们的源代码来对项目进行模块化。

这是应用程序的结构。

在此处输入图像描述

此层次结构中的顶级模块App是其他模块不依赖的模块,是应用程序的主模块。较低级别的模块domaindata不依赖的App模块,其中的App模块包括datadomain模块。我在app模块的 build.gradle 中添加了以下代码

现在,我在维护每个模块之间的依赖关系方面遇到了一些问题。由于它们每个都是一个单独的 android 模块,它们每个都有自己的build.gradle. 该App模块可以使用datadomain模块中的类。但是,我有一些通用类(例如一些注释、实用程序、广播类、Dagger 范围等),我想在所有模块中使用它们。但这些是我面临的问题

  • 由于这些类包含在主模块app中,我无法在我的dataand中访问这些类domain,因为这些模块不依赖于更高层app
  • 我在所有层中使用的任何库(例如:RxJava)都需要包含在build.gradle每个模块的

作为解决方案,我想再添加一个 android 模块,比如说common它将包含我所有的通用类以及我在所有模块中使用的库。

我的所有其他模块appdomain并将data将此模块作为依赖项。

因此,任何全局库和类都将添加到该模块中,并且每个单独的模块都将只有特定于模块的类。

这是一个好方法吗?或者有什么方法可以有效地解决这个问题?

0 投票
0 回答
66 浏览

kotlin - PagedList 的 BoundaryCallback 永远不会被调用

我在我的设备上创建了一个房间数据库,它返回

然后在我的存储库中使用这个工厂调用,在那里我将它与我的 boundaryCallback 连接起来

我的边界回调是基本的,看起来像这样

问题是,虽然我的数据源(房间数据库)不包含任何条目,但边界回调不会被调用。你有什么线索可能是什么问题吗?

0 投票
0 回答
553 浏览

android - 将当前登录用户持久保存在干净的 android 架构中的可靠方法是什么?

我一直在寻找一种干净、可靠的方式来将当前用户保留在 Android 应用程序中,该应用程序可以从任何活动/视图访问,可以立即使用,并且可以在注销时可靠地清除。

为了添加更多上下文,应用程序通过令牌 (JWT) 处理 API 身份验证。不幸的是,有效载荷中没有用户信息。

有一个MVVM架构,有一个Repository层,调用retrofit api/room db。

这是我正在探索的东西,很想知道是否有更好的方法,或者是否还有我尚未发现的另一种模式/架构:

  • 目前,一个User 对象被持久化在 Application 类上。我个人讨厌这个,这是以前存在的。登录成功后,JWT 存储在 SharedPreferences 中,User 对象作为静态变量保存在 Application 类中。
  • 立即有想法至少也将用户的重要位存储在 SharedPreferences 中。我试图找到某种方式将用户与 JWT “捆绑”,但 sharedpreferences 并不能很好地与对象配合使用。我想象一个场景,我可能为一个用户存储了一个令牌,但User另一个用户存储了对象,这将导致各种问题。
  • 除了我们的改造 API 服务层外,还有一个基本的 Room db 启动,因为我慢慢尝试在整个应用程序中加入本地缓存。所以我知道我可以坚持在User这里,尽管担心数据库调用的异步性质。
  • 我觉得我所追求的是某种架构层,一个SesssionManager或其他东西,它可以处理所有这些。将“持有”用户,令牌,具有全局Logout()方法,以某种方式与存储库层很好地配合,因此 View 和 ViewModels 根本不需要理会用户或 userId,只需进行各种存储库调用,并且数据(存储库/改造服务)层将返回适合当前登录用户等的内容。

抱歉,如果这有点抽象/高级,没有任何特定代码,我只记得几个月前找到了一篇与会话层概念有关的优秀文章,并没有将其添加为书签,现在我正在挠头试图解决干净地实现这一目标的最佳方法。

0 投票
1 回答
54 浏览

android - Why 32 bit and 64 bit Android application give different /proc/cpuinfo : feature list

We have Android 32 and 64 bit variant of our application and when we try to read /proc/cpuinfo we get different value of "features".

例如。如果 64 位应用程序读取功能的 /proc/cpuinfo 值,那么我们得到“fp asimd evtstrm aes pmull sha1 sha2 crc32”。相同的 32 位应用程序给出“half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt evtstrm aes pmull sha1 sha2 crc32”

我们已经尝试在多个版本的 Android 以及不同品牌的多个手机上执行这些应用程序。结果相同,32 位和 64 位应用程序的 cpuinfo 不同。

0 投票
2 回答
1203 浏览

java - 如何使项目兼容 64 位

最近 android 架构的变化迫使所有开发人员让他们的 android 应用程序支持 64 位。

我已经浏览了文档。但正如它在那里显示的那样,寻找一个可能有“.so”文件的“lib”文件夹。

我尝试了同样的事情,但显然我找不到和“lib”文件夹开始,我的应用程序完全用 java 编写,没有本机(C,C++)代码。

任何人都可以建议我可以做什么,或者我如何确保我的应用程序支持 64 位,或者我将如何获得带有 .so 文件的库。

0 投票
1 回答
3989 浏览

android - 如何在我的应用程序中包含 64 位和 32 位本机代码

我无法将我的应用程序上传到 Playstore 出现此错误我还构建了“Android App Bundle”来上传应用程序,但再次出现此错误。

此版本不符合 Google Play 64 位要求以下 APK 或 App Bundle 可用于 64 位设备,但它们只有 32 位本机代码:111。

0 投票
1 回答
5525 浏览

android - 将数据从一个视图模型传递到另一个 android MVVM

我有一个与设计相关的问题要问你们。

因此,我一直在按照Google 的应用程序架构指南使用 Kotlin、MVVM 和数据绑定来构建我的应用程序。我正在使用 Google 规定的 Jetpack 组件(导航、实时数据等)。

问题是在开发过程中很多时候我需要将数据从一个片段传输到另一个片段。之前我曾经创建片段的实例并添加复杂数据,然后移动到片段,如下所示:

导航在目的地之间传递数据应该是这样的或者使用同一文档中也提到的共享视图模型。>>

一般来说,您应该强烈希望在目的地之间只传递最少量的数据。例如,您应该传递一个键来检索对象,而不是传递对象本身,因为所有保存状态的总空间在 Android 上是有限的。如果您需要传递大量数据,请考虑使用在片段之间共享数据中描述的 ViewModel。

这行得通。

问题是使用架构的主要原因之一是关注点分离;这样我们就可以编写干净且可维护的代码。sharedviewmodel 的这种使用违背了这个目的(根据我的理解),因为这会导致大型 ViewModel 类。

我将尝试用一个很常见的场景来解释这个问题。

我有一个带有数据列表的片段。列表中的每个项目对应一个用户。当我们点击一​​个项目时,它应该移动到用户详细信息屏幕,如果我们点击编辑按钮,我们应该移动到可以编辑详细信息的编辑屏幕。

因此在这种情况下,ViewModel 将在这 3 个 Fragment 之间共享,因为 User 数据需要从列表类发送到视图和编辑 Fragment,并且共享的 ViewModel 将具有所有三个 Fragment 的业务逻辑。

所以这对我来说似乎不合适,因为 ViewModel 在许多情况下会太复杂而无法像这样共享:

将给出视图模型的相同实例。

我需要知道我对这个 sharedviewmodel 的理解是否错误,如果是,请纠正我。如果我的理解是正确的,请告诉我在这种情况下如何更有效地管理视图模型。