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.pswp.cn/bicheng/73507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73507.shtml
英文地址,請注明出處:http://en.pswp.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 軌道兩旁…