Android App 架构 面试专题,你可能会被问到的 20 个问题

news/2024/5/4 4:57:02/文章来源:https://blog.csdn.net/m0_71506521/article/details/130389917

iveData 是否已经被弃用?

没有被弃用。在可以预见的未来也没有废弃的计划。

LiveData 可以使用简单的方式获取一个易于观察、状态安全的对象。虽然其缺少一些丰富的操作符,但是对于一些简单的 UI 业务场景已经足够。

FlowLiveData 相同的功能,其包含大量丰富的操作符,可以简单的完成复杂的业务逻辑处理。相应的会增加一定的使用门槛,如果不需要 Flow 的 全部功能,继续使用 LiveData 即可。

什么是业务逻辑?为什么将业务逻辑移动到 Data Layer ?

业务逻辑是给 App 带来价值的东西,是一系列决定 App 如何运行的规则集。比如,如果你有一个显示新闻文章的 App,你点击书签按钮,从书签文章到持久的交互,这就是业务逻辑。

将业务逻辑移动到 Data Layer 的主要原因是提供单一信源,App 的不同页面和不同逻辑使用到这部分数据将从同一个地方进行获取,方便统一管理;其次是分离职责,将不同的处理逻辑(控制UI的与操作数据)分散在不同的层级中,可以减少各自交互的复杂度。

如何在 ViewModel 中获取系统资源(字符串、颜色等)?

访问资源只应该放在 UI 层,如 View 或者是 Compose。 可以在 ViewModel 中提供资源 ID,但是不应该直接在 ViewModel 中直接访问资源。除了单一职责之外,就是可以响应手机配置的变化:

  • 切换语言的时候,会变成对应的语种字符串;
  • 切换亮暗模式的时候,对应的颜色会随之变化;

另外就是 Context 的上下文与 ViewModel 的生命周期不一致,可能会导致内存泄漏。

如何让 Service 与 Compose/ViewModel 进行交互?

在这里插入图片描述

他们不应该直接进行交互或者说是互相引用。

应该采用单一信源的方式定义一个 Repository,在 Service/ViewModel 中调用 Repository 中的方法来更改状态,UI(Views/Compose) 层通过数据流的方式监听数据变化。

可以确定的是,在 ViewModel 中应尽可能少的依赖 Android 系统组件,如 Service、Activity 等。

未来平稳过度到 KMM/KMP 的最佳实践有哪些?

通常最佳实践会随着时间的推移而建立起来的。对于未来如果 KMM/KMP ,并不需要做过多的事情,遵循架构指南即可。比如:将数据的操作放在 Data Layer,在此层尽量少的调用系统 API。但是目前并需要定义跨端的接口定义,因为 KMM/KMP 还是比较新的技术,在他被大规模使用之前还有不少变数。

ViewModel 被建议当做 State Holders 之后,其在 MVVM 中的职责?

ViewModel 在 MVVM 中就是一个状态持有者。在不同的语义场景下可能有不同的含义。如果是整个页面中的 View(不论是 Activity 还是 Compose 中的目的地),其对应的是 AAC 中的 ViewModel 类。如果是普通的自定义 View 或是 Compose 中的一个可组合函数,那么 View 的状态持有者定义成一个普通的类就可以。这里可以类比下 RecycleView 中的 ViewHolder 设计。

所以这是根据 UI 的范围所决定的,整个页面对应的就是 ViewModel,局部页面对应的就是普通的类。

ViewModel 可以当做是一种特殊的状态管理器,他可以持有普通的 State Holders。

架构指南中的层级对模块化开发有什么建议么?

官方正在研究模块化的架构指南,希望今年能够完成。

应该在 DataSource/Repostory/UseCase 中使用 Flow 么?

可以,但是应该在合适的地方使用 Flow。如果是提供一个一次性的数据(比如从云端接口返回的一个数据),使用 suspend 函数是比较合适的。如果是从 Room 或者是其他类似的数据源中提供可以变化的数据流时,应该使用 Flow。

在 Repository 中会合并多个数据源的数据,这些数据可能会会随时间的变化而变化,因此需要使用 Flow。

什么时候应该使用 UseCase ?

UseCase 主要是为了解决以下两个问题:

  • 封装复杂的业务逻辑,避免出现大型的 ViewModel 类;
  • 封装多 ViewModel 通用的业务逻辑,避免代码重复;

满足上述两个条件的任何一个都可以使用 UseCase。除此之外,使用 UseCase 之后可以 ViewModel 就不必依赖 Repository,而是在构造函数中直接使用 UseCase,这样在构造函数中就可以知道 ViewModel 中做了哪些事情。

在 Repository 中传递多个 Suspend 函数是反模式的么?

并不是,如果只是进行一次性的操作应该使用 suspend 函数。否则的话应该使用 Flow

ViewModel 中如何处理页面跳转?

这部分内容在 UI Layer 中有提到,我们把他称之为 UI Event 之类的东西。不管是 UI 事件还是构建 UI 的数据都应该放在 UiState 中,一旦 UI 层监听到对应的事件,进行响应的跳转即可。

具体取决于采用何种方式建模,比如你可以把他定义为一个 Boolean 值,在 ViewModel 中更新对应的 UiState,UI 层就可以根据对应的事件跳转到对应的页面中了。

以用户登录为例,用户登录成功之后需要进入到主页面。这其实是一种状态的变化,从未登录变成了已登录,所以只要改变 UiState UI 层就可以处理他。你可能会说这是不是太复杂了?

对一些人来说这可能是一个顿悟时刻,不会把命令视为事件。ViewModel 中的事件整体上来看就是 App 的状态数据,这样 ViewModel 并不是告诉 UI 层应该做什么,而是 UI 层根据 App 的状态去做一些事情,这是思维方式上的转变。

如果根据用户配置定义导航视图?

和上一个问题基本类似,通过设置不同的 UiState 来控制导航到不同的视图。

WorkManager/Service 在架构中的什么位置?

WorkManager/Service 应该作为入口类来调用 Repository 中的 API。这样可以使我们的业务逻辑与 Android 系统的 API 中解放出来,因为 Android 系统 API 的行为逻辑一般是我们不可控的。当然还有另外的好处,比如更容易测试、以及后续有可能迁移到 KMM

当然,WorkManager 有其 API 自身的优势,其内部逻辑与节省电量 、WIFI 链接等 Android 平台的优势,可以根据设备自身的状态进行一次性或者周期性的任务。当然,如果是正常的耗时操作(如网络请求)使用简单的协程即可。

为什么有时在 Repository 中使用 IoDispatcher 访问数据库,有时不用?

Room 数据库目前已支持 suspend 函数,其默认会将任务放到后台线程中执行,当然也可以对其进行自定义的配置。当你调用 Room 的一个 suspend 函数的时候,你并不需要关心线程的问题,把这个问题交给 Room 处理即可。这样 Room 的所有操作都会放到 Room 控制的线程中执行,以尽可能的减少因访问同一个文件而导致的互相争夺资源的问题。

不管由于什么原因你无法使用/提供 suspend 函数,Room 不支持将其移动到另一个线程中。这种情况下可以使用 IO 线程或者 IoDispatcher 。通常情况下还是建议使用 suspend 函数或是 Flow。

另外,每个 DataSource 中都建议处理自己的线程问题,所以在 Repository 中并不需要关心 IO 线程的问题。

当我们处理内存敏感数据时,将复杂数据从一个屏幕传输到另一个屏幕的建议方法是什么?

最原始的处理方式可能是使用 Activity 当做两个 Fragment 的中介,在 Activity 中实现 Fragment 中定义接口,当 Fragment 被关联到 Activity 之后就可以调用 Fragment 中相关的逻辑了。当然这种方式已经一去不复返了。

现在可以使用 ViewModel 调用 UseCase 或者是 Repository 来更新数据,另外的 ViewModel 会使用 Flow 的方式接收到数据的变化,然后根据变化做出相应的处理即可。

在 Compose 中应该使用 MVVM 还是 MVI ?

两者没有本质的区别,都是采用单向数据流的方式。MVI 的特点是将 UI 事件封装成枚举方式,统一在一个函数中处理事件。

随着项目的扩展,我应该将 Domain Layer 或者 Data Layer移动到单独的模块吗?

这取决于你是否想进行模块化,但是两者的差异并不大,这里并没有一个明确的答案。 随着项目的扩展建议把 Data Layer 放到单独的 module 中,如果有 Domain Layer 的话,也是建议把他放在单独的模块中。

[!info] 注: 如果是在多仓库的模块架构以及同一数据层可能有不同 UI 实现的场景下建议采用上述方式,如果没有类似需求的话,个人建议通过 Feature (特性)划分模块,这样可以减少不必要的编译耗时,同样的功能也想多内聚。 当然,如果有对外提供 SDK 需求的,也应将 Data Layer 定义在单独的模块中。

将错误从其他层返回到表示层的最佳方法是什么?

指导文档 中的建议的方式是使用协程的异常处理机制将错误传递到展示层(UI Layer)。

对于使用协程或者是 Flow 的方式,建议使用协程的异常处理机制,当然 Folw 中也可以使用 catch 操作符;对于使用 suspend 函数的地方可以使用 try/catch 块。

另外一种 Data Layer 和上层交互的方式就是使用 Kotlin 自带的 Result<T> 类,此类中除了包含正常的数据 T 之外,还包含错误信息。除此之外提供很多好用的 API ,建议使用。

新的架构方式是否适用与非移动端的领域?如平板、Auto 等

在上述的领域上,仍然建议使用 UI LayerDomain LayerData Layer 这种架构方式。这种架构方式主要是用到了关注点分离以及数据驱动的方式,而这两种设计原则对非移动端的应用也是适用的。

多 Activity 还是单 Activity + 多 Fragment ?

Activity 有其自身的一些特定及职责,在以下场景中应该使用 Activity:

  • 当前页面需要支持 PIP(画中画)功能时;
  • 当 App 有多个入口可以启动时,如在其他 App 中拉起当前 App 中的一个二级页面,这个页面就需要使用 Activity;

简而言之,就是需要在 manifest 文件中 exported 需要被设置为 true 的逻辑都需要使用 Activity 来实现。

除此之外的一些逻辑,通常是 App 内部的一些页面导航,这个时候应该使用 Fragment 来实现。当然,现在我们还有另外一个新的选择,那就是使用 Compose 。

更多Android面试锦集推荐

如需更多Android面试题 点击前往传送直达↓↓↓
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103957.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop2.x集群搭建(centos7、VMware、finalshell)

第一章 Hadoop集群安装 1.1 集群规划 集群规划规划操作系统Mac、Windows虚拟软件Parallels Desktop(Mac)、VMWare(Windows)虚拟机主机名: c1, IP地址: 192.168.10.101主机名: c2, IP地址: 192.168.10.102主机名: c3, IP地址: 192.168.10.103软件包上传路径/root/softwares软件…

一维卷积与一维平均池化的时间复杂度

看Pytorch官方文档就懂了: 1维卷积 1维平均池化 参考资料 Conv1d — PyTorch 2.0 documentation AvgPool1d — PyTorch 2.0 documentation

【软件测试面试】面试技巧,让面试官记住的自我介绍,疯狂收割offer.....

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在讨论如何自我介…

python基于轻量级YOLOv5的生猪检测+状态识别分析系统

在我之前的一篇文章中有过生猪检测盒状态识别相关的项目实践&#xff0c;如下&#xff1a; 《Python基于yolov4实现生猪检测及状态识》 感兴趣的话可以自行移步阅读&#xff0c;这里主要是基于同样的技术思想&#xff0c;将原始体积较大的yolov4模型做无缝替换&#xff0c;使…

大数据之入门开发流程介绍

目录&#xff1a; 1、大数据的开发大致流程2、技术导图 1、大数据的开发大致流程 1.1 数据收集 大数据处理的第一步是数据的收集。现在的中大型项目通常采用微服务架构进行分布式部署&#xff0c;所以数据的采集需要在多台服务器上进行&#xff0c;且采集过程不能影响正常业务的…

Tpflow V7.0.2 PHP 工作流引擎新版发布

欢迎使用 Tpflow V7.0.1 工作流引擎 TpFlow 工作流引擎是一套规范化的流程管理系统&#xff0c;基于业务而驱动系统生命力的一套引擎。彻底释放整个信息管理系统的的活力&#xff0c;让系统更具可用性&#xff0c;智能应用型&#xff0c;便捷设计性。Tpflow 团队致力于打造中国…

ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析

第一章、生态系统服务讲解 1.生态系统服务概念和基本理论 ​ 2.生态系统服务评估方法与模型讲解 ​ ​ 3.生态系统服务权衡与协同研究方法与意义 ​ 4.文献可视化分析 ​ ​ 第二章、平台基础 一、ArcGIS Pro介绍1. ArcGIS Pro简介2. ArcGIS Pro基础3. ArcGIS Pro数据预处理4…

kafka_2.13-2.8.1环境搭建

本次kafka环境主要针对kafka2.x版本&#xff0c;运行kafka服务之前&#xff0c;需要先搭建zookeeper服务&#xff0c;因为kafka服务依赖zookeeper&#xff0c;kafka3.x版本后可以不需要手动搭建zookeeper了。 本文主要是介绍怎样搭建kafka2.8.1&#xff0c;关于kafka的操作&am…

每天一道算法练习题--Day13 第一章 --算法专题 --- ----------动态规划(重置版)

动态规划是一个从其他行业借鉴过来的词语。 它的大概意思先将一件事情分成若干阶段&#xff0c;然后通过阶段之间的转移达到目标。由于转移的方向通常是多个&#xff0c;因此这个时候就需要决策选择具体哪一个转移方向。 动态规划所要解决的事情通常是完成一个具体的目标&…

问卷中多选题如何分析?

一、案例与问卷 本研究选取大学生作为研究对象&#xff0c;旨在通过理财认知、理财现状、理财偏好三个方面&#xff0c;对大学生理财产品了解情况、使用需求进行调查。本次问卷共分为四个部分&#xff1a;第一部分共5道题&#xff0c;为基本信息题&#xff1b;第二部分共3道题…

dubbogo如何实现远程配置管理 -- 阅读官方文档

dubbo-go 中如何实现远程配置管理&#xff1f; 之前在 Apache/dubbo-go&#xff08;以下简称 dubbo-go &#xff09;社区中&#xff0c;有同学希望配置文件不仅可以放于本地&#xff0c;还可以放于配置管理中心里。那么&#xff0c;放在本地和配置管理中心究竟有哪些不一样呢&…

【browserify】一步步教你学会browserify

https://www.cnblogs.com/fsg6/p/13139627.html Browserify browserify的官网是http://browserify.org/&#xff0c;他的用途是将前端用到的众多资源&#xff08;css,img,js,…) 打包成一个js文件的技术。 比如在html中引用外部资源的时候&#xff0c;原来我们可能这样写 &l…

从0搭建Vue3组件库(九):VitePress 搭建部署组件库文档

VitePress 搭建组件库文档 当我们组件库完成的时候,一个详细的使用文档是必不可少的。本篇文章将介绍如何使用 VitePress 快速搭建一个组件库文档站点并部署到GitHub上 安装 首先新建 site 文件夹,并执行pnpm init,然后安装vitepress和vue pnpm install -D vitepress vue安…

年轻不乏野心,想做年薪40万+的软件测试工程师?写给长途漫漫中的你...

本人从事自动化测试10年多&#xff0c;之前在猪场工作&#xff0c;年薪突破40W&#xff0c;算是一个生活过得去的码农。&#xff08;仅代表本人&#xff09; 目前从事自动化测试的薪资待遇还是很不错的&#xff0c;所以如果朋友们真的对自动化感兴趣的话可以坚持学下去&#xf…

一种视频算法插件流水线执行架构

目的 将视频接入进来以后&#xff0c;使用算法对图像进行处理并且输出 1 各种接入 2 解码 3 解码后图像算法 如矫正算法 4 共享输出 方式 使用动态库的方式进行扫描底层&#xff0c;每个动态库为一个插件&#xff0c;每个插件包含特定的函数&#xff0c;通过扫描的方式加载所…

基于springboot的大学生租房系统源码论文数据库

3.1系统功能 现在无论是在PC上还是在手机上&#xff0c;相信全国所有地方都在进行大学生租房管理。随着经济的不断发展&#xff0c;系统管理也在不断增多&#xff0c;大学生租房系统就是其中一种&#xff0c;很多人会登录到相关的租房系统查看租房信息&#xff0c;还能查看房屋…

11.java程序员必知必会类库之word处理库

前言 正常业务中&#xff0c;可能涉及到和合作方签约电子合同&#xff0c;此时&#xff0c;我们需要先设计合同模板&#xff0c;维护固定内容&#xff0c;将可变的内容通过占位符替代&#xff0c;等签章的时候&#xff0c;生成pdf,然后可以根据设计的合同章的坐标&#xff0c;…

Linux基础命令和程序部署

Linux基础命令 ls 可以查看当前目录内容ls 后面跟上一个具体路径可以查看指定目录内容ls -l 可以以列表的形式查看&#xff0c;缩写llpwd 查看当前目录的绝对路径cd 切换目录&#xff08;就是window界面的鼠标双击目录进入动作&#xff09;&#xff0c;cd在切换目录时后面可以…

Android 9.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

1.前言 在android9.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度,旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现,接下来就来分析实现…

详解子网划分练习题(32道)

目录 1 子网划分概念&#xff1a; 2 划分方法&#xff1a; 子网划分方法&#xff1a;段&#xff0c;块&#xff0c;数的计算三步。 段就是确定ip地址段中既有网络地址&#xff0c;又有主机地址的那一段是四段中的那一段&#xff1f; 块就确定上一步中确定的那一段中的主机…