Android第二次面试总结(项目拷打理论篇)

(一)理论基础

  LiveData 和 ViewModel 是 Android 架构组件中的重要部分,它们在构建响应式、生命周期感知的 Android 应用程序中发挥着关键作用。下面分别介绍它们的原理。

LiveData 原理

1. 概述

LiveData 是一种可观察的数据持有者类,它具有生命周期感知能力,这意味着它能遵循其他应用组件(如 ActivityFragment)的生命周期。只有处于活跃状态(如 STARTED 或 RESUMED)的观察者才能收到数据更新的通知。

2. 核心组成部分
  • LiveData 类:作为数据的持有者,它内部维护了一个数据对象和一个观察者列表。
  • Observer 接口:定义了一个 onChanged(T t) 方法,当 LiveData 中的数据发生变化时,会调用该方法通知观察者。
  • LifecycleOwner 接口:表示具有生命周期的对象,如 Activity 和 Fragment 都实现了该接口。LiveData 通过 Lifecycle 来感知 LifecycleOwner 的生命周期状态。
3. 工作原理
  • 注册观察者:当调用 LiveData.observe(LifecycleOwner owner, Observer<? super T> observer) 方法时,LiveData 会将 LifecycleOwner 和 Observer 包装成一个 LifecycleBoundObserver 对象,并将其添加到观察者列表中。同时,LifecycleBoundObserver 会监听 LifecycleOwner 的生命周期变化。
// Java 示例
LiveData<String> liveData = new MutableLiveData<>();
observe(lifecycleOwner, new Observer<String>() {@Overridepublic void onChanged(String s) {// 处理数据变化}
});
  • 生命周期感知LifecycleBoundObserver 实现了 LifecycleEventObserver 接口,当 LifecycleOwner 的生命周期状态发生变化时,LifecycleBoundObserver 会收到相应的事件通知。如果 LifecycleOwner 进入活跃状态(STARTED 或 RESUMED),LiveData 会将最新的数据发送给该观察者;如果 LifecycleOwner 进入销毁状态(DESTROYED),LiveData 会自动移除该观察者,以避免内存泄漏。
  • 数据更新:当调用 LiveData.setValue(T value) 或 LiveData.postValue(T value) 方法更新数据时,LiveData 会检查所有观察者的生命周期状态,只有处于活跃状态的观察者才会收到 onChanged 方法的调用。

ViewModel 原理

1. 概述

ViewModel 旨在存储和管理与 UI 相关的数据,并且在配置更改(如屏幕旋转)时保持数据的一致性。它的生命周期比 Activity 或 Fragment 更长,直到关联的 Activity 或 Fragment 被销毁(对于 Activity 是 onDestroy() 调用且不是由于配置更改;对于 Fragment 是 onDestroy() 调用)。

2. 核心组成部分
  • ViewModel 类:开发者自定义的 ViewModel 类需要继承自 ViewModel 类,用于存储和管理与 UI 相关的数据。
  • ViewModelProvider 类:负责创建和管理 ViewModel 实例。它使用 ViewModelStore 来存储 ViewModel 实例。
  • ViewModelStore 类:是一个简单的键值对存储结构,用于存储 ViewModel 实例。每个 Activity 和 Fragment 都有一个对应的 ViewModelStore
3. 工作原理
  • 创建 ViewModel 实例:当调用 ViewModelProvider(owner).get(MyViewModel.class) 方法时,ViewModelProvider 会首先检查 ViewModelStore 中是否已经存在指定类型的 ViewModel 实例。如果存在,则直接返回该实例;如果不存在,则使用 ViewModelProvider.Factory 创建一个新的 ViewModel 实例,并将其存储在 ViewModelStore 中。
// Java 示例
ViewModelProvider viewModelProvider = new ViewModelProvider(this);
MyViewModel viewModel = viewModelProvider.get(MyViewModel.class);
  • 配置更改时数据保留:当发生配置更改(如屏幕旋转)时,Activity 或 Fragment 会被销毁并重新创建,但 ViewModelStore 会被保留。因此,重新创建的 Activity 或 Fragment 可以从 ViewModelStore 中获取之前的 ViewModel 实例,从而保持数据的一致性。
  • 生命周期管理:当 Activity 或 Fragment 被销毁(不是由于配置更改)时,ViewModelStore 会调用 clear() 方法,该方法会遍历所有存储的 ViewModel 实例,并调用它们的 onCleared() 方法,以便进行资源释放。

  LiveData 是具有生命周期感知能力的数据持有者,通过监听 LifecycleOwner 状态更新活跃观察者,ViewModel 借助 ViewModelProvider 和 ViewModelStore 存储管理 UI 数据,在配置更改时保留数据并在关联组件非配置更改销毁时清理资源。

   下一阶段   

  Room 是 Android 官方提供的一个 SQLite 对象映射库,用于在 Android 应用中简化数据库操作,WorkManager 是 Android 架构组件之一,用于在应用中调度和管理后台任务。

Room 工作原理 

  • 抽象层封装:Room 提供了一个抽象层,将 SQLite 数据库的操作抽象成 Java 或 Kotlin 接口和注解。开发者可以通过定义实体类(@Entity)、数据访问对象(@Dao)和数据库类(@Database)来描述数据库结构和操作。
  • 编译时处理:在编译时,Room 会根据开发者定义的注解生成相应的 SQLite 语句和实现代码。这样可以在编译时发现数据库操作中的错误,提高开发效率和代码的健壮性。
  • 线程管理:Room 默认不允许在主线程中执行数据库操作,因为数据库操作通常是耗时的,可能会导致 UI 卡顿。因此,Room 会将数据库操作放在后台线程中执行。

定义实体类

import androidx.room.Entity
import androidx.room.PrimaryKey@Entity(tableName = "users")
data class User(@PrimaryKey(autoGenerate = true)val id: Int = 0,val name: String,val age: Int
)

定义数据访问对象(DAO)

import androidx.room.Dao
import androidx.room.Insert@Dao
interface UserDao {@Insertsuspend fun insertUser(user: User)
}

定义数据库类

import androidx.room.Database
import androidx.room.RoomDatabase@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {abstract fun userDao(): UserDao
}
WorkManager 工作原理
  • 任务调度:WorkManager 会根据任务的约束条件(如网络连接、电池状态等)和设备的当前状态来决定何时执行任务。它会尽量在设备处于空闲状态时执行任务,以减少对用户体验的影响。
  • 任务持久化:WorkManager 会将任务信息持久化到本地数据库中,即使应用被杀死或设备重启,任务信息也不会丢失。当设备满足任务的约束条件时,WorkManager 会重新调度任务执行。
  • 生命周期管理:WorkManager 会自动处理任务的生命周期,包括任务的执行、重试和取消等操作。它会根据任务的状态(如运行中、已完成、失败等)更新任务信息。

创建 WorkManager 任务

import android.content.Context
import androidx.work.Worker
import androidx.work.WorkerParameters
import kotlinx.coroutines.runBlockingclass InsertUserWorker(context: Context, params: WorkerParameters) : Worker(context, params) {override fun doWork(): Result {val database = Room.databaseBuilder(applicationContext,AppDatabase::class.java,"app-database").build()val userDao = database.userDao()val user = User(name = "John", age = 30)runBlocking {userDao.insertUser(user)}return Result.success()}
}

调度 WorkManager 任务 

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManagerclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val workRequest = OneTimeWorkRequest.Builder(InsertUserWorker::class.java).build()WorkManager.getInstance(this).enqueue(workRequest)}
}
Room + WorkManager 协同工作原理
  • 数据交互:WorkManager 可以在后台任务中执行 Room 数据库操作,如插入、查询、更新和删除数据。这样可以避免在主线程中执行耗时的数据库操作,提高应用的性能和响应速度。
  • 任务调度:当应用需要在特定条件下执行数据库操作时,可以使用 WorkManager 来调度这些任务。例如,当设备连接到网络时,执行数据同步任务,将本地数据库中的数据上传到服务器。
  • 数据一致性:由于 WorkManager 会保证任务的执行,即使应用在任务执行过程中被杀死或设备重启,任务也会在合适的时机继续执行。这样可以确保数据库操作的完整性和数据的一致性。

 总结:

  Room 作为 Android 的 SQLite 对象映射库,在编译时根据注解生成数据库操作代码并管理线程,WorkManager 依据任务约束和设备状态调度持久化的后台任务,二者结合时 WorkManager 可在后台任务里执行 Room 的数据库操作,保障数据一致性,实现时先添加依赖,再定义 Room 数据库,创建 WorkManager 任务,最后调度任务执行。

  下一篇我将讲述面试中我被项目拷打到的点!!!

感谢观看!!!

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

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

相关文章

MyBatis SqlSessionFactory 是如何创建的?

SqlSessionFactory 是 MyBatis 的核心接口之一&#xff0c;它是创建 SqlSession 实例的工厂。 SqlSession 实例是 MyBatis 与数据库交互的主要接口&#xff0c;负责执行 SQL 语句、管理事务等。 SqlSessionFactory 的创建过程主要由 SqlSessionFactoryBuilder 类负责。 SqlSes…

玩转python:通俗易懂掌握高级数据结构-collections模块之Counter

引言 Counter是Python中collections模块提供的一个强大工具&#xff0c;用于统计可哈希对象的出现次数。它非常适合用于频率统计、词频分析、数据聚合等场景。本文将详细介绍Counter的关键用法和特性&#xff0c;并通过8个丰富的案例帮助读者掌握其应用。 关键用法和特性表格 …

DeepSeek面试——分词算法

DeepSeek-V3 分词算法 一、核心算法&#xff1a;字节级BPE&#xff08;Byte-level BPE&#xff0c;BBPE&#xff09; DeepSeek-V3 采用 字节级BPE&#xff08;BBPE&#xff09; 作为核心分词算法&#xff0c;这是对传统 BPE&#xff08;Byte Pair Encoding&#xff09;算法的…

机器学习——正则化、欠拟合、过拟合、学习曲线

过拟合&#xff08;overfitting&#xff09;:模型只能拟合训练数据的状态。即过度训练。 避免过拟合的几种方法&#xff1a; ①增加全部训练数据的数量&#xff08;最为有效的方式&#xff09; ②使用简单的模型&#xff08;简单的模型学不够&#xff0c;复杂的模型学的太多&am…

Python:函数(一)

python函数相关的知识点 1. 函数定义与调用 定义&#xff1a;使用 def 关键字&#xff0c;后接函数名和参数列表。 def greet(name):"""打印问候语&#xff08;文档字符串&#xff09;"""print(f"Hello, {name}!") 调用&#xff1a…

关于Flutter中两种Widget的生命周期详解

目录 一、StatelessWidget 生命周期 二、StatefulWidget 生命周期 1. 创建阶段 2. State初始化阶段 3. 构建阶段 4. 更新阶段 5. 销毁阶段 三、核心对比与常见陷阱 四、面试回答技巧 以下是Flutter中两种核心Widget(StatelessWidget和StatefulWidget)生命周…

Linux 》》Ubuntu 18 LTS 之后的版本 修改IP地址 主机名

进入目录 /etc/netplan 修改 50-cloud-init.yaml 》保存文件后&#xff0c;执行以下命令应用更改&#xff1a; sudo netplan apply 》》 DHCP模式 修改主机名 hostnamectl set-hostname xxxx 修改cloud.cfg 防止重启主机名还原 但测试下来 不修改&#xff0c; 重启 也不会还…

C++基础 [三] - 面向对象三

初始化列表 首先&#xff0c;初始化列表是我们的祖师爷本贾尼博士为了解决在某些成员变量在定义时必须初始化的情况。这个初始化列表其实发生在构造函数之前&#xff0c;也就是实例化整个对象时先对所有的成员都进行了初始化 初始化的概念区分 在之前的博客学习中&#xff…

55年免费用!RevoUninstaller Pro专业版限时领取

今天&#xff0c;我要给大家介绍一款超给力的卸载工具——RevoUninstaller Pro。这是一款由保加利亚团队精心打造的专业级卸载软件&#xff0c;堪称软件卸载界的“神器”。 RevoUninstaller分为免费版和专业版。专业版功能更为强大&#xff0c;但通常需要付费才能解锁全部功能。…

目前人工智能的发展,判断10年、20年后的人工智能发展的主要方向,或者带动的主要产业

根据2025年的最新行业研究和技术演进趋势&#xff0c;结合历史发展轨迹&#xff0c;未来10-20年人工智能发展的主要方向及带动的产业将呈现以下六大核心趋势&#xff1a; 一、算力革命与底层架构优化 核心地位&#xff1a;算力将成为类似“新能源电池”的基础设施&#xff0c;…

【机器人】复现 ASGrasp 通用透明物体重建、6-DoF抓取预测

在机器人抓取领域&#xff0c;透明和镜面物体的抓取一直是个难题。 ASGrasp核心是两层学习型立体网络&#xff0c;能够同时恢复透明和镜面物体的可见部分和不可见部分的深度信息。 然后融合两层深度信息&#xff0c;进行重建物体&#xff0c;得到点云信息作为GSNet&#xff0…

2. qt写带有槽的登录界面(c++)

我们在1.Qt写简单的登录界面(c)_c qt 设计一个简单界面-CSDN博客中写了个简单的登录界面&#xff0c;但没有槽&#xff0c;在这里写一个带有槽的界面。 1.代码 代码目录如下&#xff1a; main.cpp的代码如下&#xff1a; #include "MainWindow.h" #include <Qt…

windows安装两个或多个JDK,并实现自由切换

我用两个JDK来做演示&#xff0c;分别是JDK8和JDK17(本人已安装JDK8&#xff0c;所以这里只演示JDK17的安装)。 1、下载JDK17安装 Java Downloads | Oracle 2、安装JDK17,这里忽略。直接双击软件&#xff0c;点击下一步就可以。 3、配置环境变量 在系统变量中新建一个CLASSP…

【2025最新】深度学习框架PyTorch——从入门到精通(1)下载与安装

又名&#xff1a;芜湖起飞侠的PyTorch学习记录——从起飞到坠毁 简介安装内容总览安装AnacondaAnaconda简介Anaconda下载配置环境变量验证其他配置安装matplotlib 安装 CUDA安装之前安装cuDNN 安装torchCPU 版本安装GPU 版本安装通过pip安装&#xff08;不推荐&#xff09;通过…

C++数据结构1——栈结构详解

一、栈的基本概念与特性 1. 栈的定义与特点 栈&#xff08;Stack&#xff09;是一种遵循后进先出&#xff08;LIFO, Last In First Out&#xff09;原则的线性数据结构&#xff0c;其核心特征包括&#xff1a; 单端操作&#xff1a;所有操作仅通过栈顶进行 动态存储&#xf…

【Python 数据结构 15.哈希表】

目录 一、哈希表的基本概念 1.哈希表的概念 2.键值对的概念 3.哈希函数的概念 4.哈希冲突的概念 5.常用的哈希函数 Ⅰ、直接定址法 Ⅱ、平方取中法 Ⅲ、折叠法 Ⅳ、除留余数法 Ⅴ、位与法 6.哈希冲突的解决方案 Ⅰ、开放定址法 Ⅱ、链地址法 7.哈希表的初始化 8.哈希表的元素插…

历年云南大学计算机复试上机真题

历年云南大学计算机复试机试真题 在线评测&#xff1a;传送门&#xff1a;pgcode.cn 喝饮料 题目描述 商店里有 n 中饮料&#xff0c;第 i 种饮料有 mi 毫升&#xff0c;价格为 wi。 小明现在手里有 x 元&#xff0c;他想吃尽量多的饮料&#xff0c;于是向你寻求帮助&#x…

[文献阅读] 可变形卷积DCN - Deformable Convolutional Networks

**文献信息&#xff1a;**Deformable Convolutional Networks arxiv.org/abs/1703.06211 发表于ICCV 2017&#xff0c;提出了可变形卷积DCN&#xff08;Deformable ConvNets&#xff09; 摘要 卷积神经网络&#xff08;CNN&#xff09;由于其构建模块固定的几何结构天然地局限…

德语A1学习

Hast du morgen Zeit? Wann spielen wir? Vocabulary etwas/jemanden brauchen braucht, brauchte, hat gebraucht to need something/somebody Das geht. That works./Thats OK. den ganzen Tag the entire day dieser, diese, dieses this erst just; only G…

路局的上道检修过程中,利用AI视觉技术对轨道两旁设备设施进行检修

在铁路局的上道检修过程中,利用AI视觉技术对轨道两旁设备设施(如信号设备、电缆、接触网、通信设备等)以及铁路上方的电线(如接触网、电力线)进行异常检测,可以显著提高检修效率、降低人工成本并增强安全性。以下是具体的应用方案和技术路径: 1. 应用场景 1.1 轨道两旁…