如何在 Android 項目中實現跨庫傳值

背景介紹

在一個復雜的 Android 項目中,我們通常會有多個庫(lib),而主應用程序(app)依賴所有這些庫。目前遇到的問題是,在這些庫中,libAd 需要獲取 libVip 的 VIP 等級狀態,但這兩個庫之間沒有直接依賴關系。

問題分析

一種不太優雅的解決方案是直接讓 libAd 依賴 libVip,這樣雖然能快速解決問題,但會帶來多個潛在缺點:

  1. 依賴混亂
    當庫之間形成直接依賴時,會導致項目的依賴關系變得復雜且難以管理。每增加一個新的依賴,都可能影響到項目的構建時間、性能以及可移植性。

  2. 違反單一職責原則(Single Responsibility Principle, SRP)
    libAd 本應專注于廣告相關功能,而不是負責管理 VIP 狀態。如果它依賴于 libVip,則意味著它同時承擔了額外的責任,使其更難維護。

  3. 降低模塊化和可復用性
    增加不必要的依賴會使得庫變得不夠獨立,降低了它們的可重用性。此后若要將這些庫用于其他項目,還需要處理不相關的依賴關系。

  4. 演變成緊耦合系統
    隨著項目的發展,如果每個模塊都通過直接依賴來獲取所需信息,整個系統將逐漸演變為緊耦合的體系結構。這種結構讓系統中的一個變化可能導致一連串的調整,增加了維護成本和復雜性。

  5. 違反開閉原則(Open/Closed Principle, OCP)
    系統應該對擴展開放,對修改關閉。直接依賴使得系統在面對需求變化時,需要頻繁修改已有代碼,而不是通過擴展實現新功能。

因此,我們需要尋找一種更好的方法來實現跨庫的數據傳遞,以保持庫之間的獨立性和系統的靈活性,同時遵循良好的設計原則,從而提高代碼的可維護性和可擴展性。

簡單方案的缺陷

一個簡單的方法是利用已有的 libNet 庫作為中介。這種方法基于以下前提和依賴關系:

  1. 現有依賴關系
    在當前項目結構中,libAdlibVip 都已經依賴于 libNet。這意味著它們都能夠訪問 libNet 提供的功能,而無需額外增加任何新的直接庫間依賴。

  2. 中介模式的應用

    • 通過使用 libNet 作為中介,我們可以在不直接修改 libAdlibVip 的情況下,實現它們之間的數據傳遞。具體做法如下:
      • libVip 的 VIP 等級發生變化時,它會調用 libNetsetVipInfo(String info) 方法,將最新的信息存儲在 libNet 中。
      • libAd 需要查詢 VIP 信息時,它會調用 libNetgetVipInfo() 方法,從而獲得最新的 VIP 數據。
  3. 優勢與權衡

    • 優勢:這種方法利用了已有的依賴關系,不需要引入新的依賴或大幅度改變系統架構。
    • 缺點:雖然實現簡單,但 libNet 的設計初衷可能并不是作為數據共享平臺,這樣的用途可能會使其承擔過多職責,違反單一職責原則,同時數據更新的及時性也無法得到保證。

通過這種方式,我們能在短時間內解決跨庫數據傳遞的問題,不過從長遠來看,仍需考慮更符合設計原則的重構方案,以保持代碼的清晰性和可維護性。

推薦方案:使用 app 作為中介

由于 app 本身依賴于 libAdlibVip,所以我們可以在 app 層面處理這種數據傳遞。下面介紹具體實現步驟:

1. 為 libAd 添加接口

首先,為 libAd 新增一個接口,用于同步 libVip 的數據:

/*** libAd 同步 libVip 的數據* 如果需要同步其他無依賴關系的庫的數據,可以繼續新增方法*/
public interface LibAdDataListener {/*** @return 是否是 Vip*/boolean isVip();/*** @return 獲取當前 VIP 類型*/String getVipType();
}

2. 在 libAd 的管理類中新增方法

AdManager 類中添加以下方法,用于設置和獲取數據監聽器:

private LibAdDataListener dataListener;public AdManager setSharedDataListener(LibAdDataListener dataListener) {this.dataListener = dataListener;return this;
}public LibAdDataListener getSharedDataListener() {return dataListener;
}

3. 在 app 中實現數據監聽

在應用的 Application 類的初始化方法中,設置 LibAdDataListener 實現:

AdManager.getInstance(this).setSharedDataListener(new LibAdDataListener() {@Overridepublic boolean isVip() {// TODO: 調用 libVip 數據return false;}@Overridepublic String getVipType() {// TODO: 調用 libVip 數據return null;}
});

4. 在 libAd 中獲取信息

libAd 需要獲取 VIP 信息時,可以直接調用:

LibAdDataListener listener = AdManager.getInstance(context).getSharedDataListener();

通過這種方式,我們有效地解耦了 libAdlibVip,同時利用 app 作為中介來實現數據共享。這種設計既避免了庫之間的直接依賴,也遵循了合適的設計原則,使得系統更加靈活和可維護。

  • 相關文章 Android:lib庫之間互不依賴,怎么傳值?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62691.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62691.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62691.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

非常規使用client-go踩坑記

0x01 背景 編程者總有想偷懶的傾向。至少我的初衷時,盡量復用現有的代碼。但有時也會變得弄巧成拙。 這不,最近需要在一個Go服務里添加一個CRD的緩存等待。熟悉k8s的同學都知道,向 kube-apiserver 提交一個更新,到同一個進程中的…

OpenGL ES詳解——多個紋理實現混疊顯示

目錄 一、獲取圖片紋理數據 二、著色器編寫 1. 頂點著色器 2. 片元著色器 三、綁定和繪制紋理 1. 綁定紋理 2. 繪制紋理 四、源碼下載 一、獲取圖片紋理數據 獲取圖片紋理數據代碼如下: //獲取圖片1紋理數據 mTextureId loadTexture(mContext, R.mipmap.…

java引用相關(四大引用類型,軟引用避免oom,弱引用表,虛引用和引用隊列,可達性分析算法)

1. 什么是引用? 問題:什么是引用?Java中的引用是如何工作的? 答案: 引用 是對象的句柄,用于訪問堆內存中的對象。在Java中,引用變量實際上存儲的是對象的地址,而不是對象本身。通…

十一、容器化 vs 虛擬化-Docker

文章目錄 前言一、Docker 介紹1. 簡介2. 應用場景3. 特點4. Docker和虛擬機之間的區別5. 解決痛點1. 解決依賴兼容2. 解決操作系統環境差異3. 小結 二、Docker 架構三、工作流程五、Docker 核心組件及其工作機制1. Docker 客戶端(Docker Client)2. Docke…

linux學習筆記01 基礎命令

目錄 創建 touch 創建文件 (創建但是不打開) vi / vim 創建文件 (創建一個文件并打開) mkdir 創建文件夾 切換目錄 cd 查看 pwd 查看當前目錄完整路徑 ls 查看目錄信息 dir 查看目錄信息 ll 表示查看目標目錄下的信息 ls -a 查看當前目錄下的…

【深度學習】深刻理解多模態模型CLIP

CLIP(Contrastive Language-Image Pretraining) 是由 OpenAI 提出的一個多模態模型,旨在學習視覺和語言的聯合表示,能夠通過圖像和文本之間的對比學習來實現圖像和文本之間的緊密聯系。CLIP 模型可以通過自然語言描述理解和處理圖…

android 聊天界面鍵盤、表情切換絲滑

1、我們在聊天頁面時候,往往會遇到,鍵盤、表情、其他選擇切換時候頁面會出現掉下來再彈起問題,這是因為,我們切換時候,鍵盤異步導致內容View高度變化,頁面掉下來后,又被其他內容頂起這種很差視覺…

Nginx 緩存系統 proxy_cache詳解

系列文章目錄 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 例如:第一章 Python 機器學習入門之pandas的使用 提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目…

mysql時間戳格式化yyyy-mm-dd

格式化到 年月日 # 將時間換成列名就行;當前是秒級時間戳,如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

PDFMathTranslate,PDF多語言翻譯,批量處理,學術論文,雙語對照(WIN/MAC)

分享一個非常實用的PDF文檔翻譯項目——PDFMathTranslate。作為一個經常逛GitHub的開發者,我總喜歡翻看各種項目附帶的論文,雖然大多時候是瞎研究,但卻樂在其中。該項目能夠完美保留公式、圖表、目錄和注釋,對于需要閱讀外文文獻的…

網絡藥理學:(待更)Alphafold3和批量分子動力學模擬(Desmond、AutoMD)

批量動力學模擬 注意全都需要在類linux平臺上進行 安裝Desmond模塊: https://github.com/Wang-Lin-boop/Schrodinger-Script 安裝AutoMD模塊: Wang-Lin-boop/CADD-Scripts: Scripts for virtual screening, cross docking and protein relax using Sc…

爬蟲基礎之代理的基本原理

在做爬蟲的過程中經常會遇到一種情況,就是爬蟲最初是正常運行、正常抓取數據的,一切看起來都是那么美好,然而一杯茶的工夫就出現了錯誤,例如 403 Forbidden,這時打開網頁一看,可能會看到“您的IP訪問頻率太…

第十七屆山東省職業院校技能大賽 中職組“網絡安全”賽項資源任務書樣題③

第十七屆山東省職業院校技能大賽 中職組“網絡安全”賽項資源任務書樣題③ 模塊A 基礎設施設置與安全加固(200分)A-1 登錄安全加固(Windows, Linux)A-2 Nginx安全策略(Linux)A-3日志監控(Windows)A-4中間件…

鯤鵬麒麟安裝Kafka-v1.1.1

因項目需要在鯤鵬麒麟服務器上安裝Kafka v1.1.1,因此這里將安裝配置過程記錄下來。 環境說明 # 查看系統相關詳細信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

群控系統服務端開發模式-應用開發-登錄退出發送郵件

一、登錄成功發送郵件 在根目錄下app文件夾下controller文件夾下common文件夾下&#xff0c;修改Login.php&#xff0c;代碼如下 <?php /*** 登錄退出操作* User: 龍哥三年風水* Date: 2024/10/29* Time: 15:53*/ namespace app\controller\common; use app\controller\Em…

[游戲開發] Unity中使用FlatBuffer

什么是FlatBuffer 官網&#xff1a; GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization LibraryFlatBuffers: Memory Efficient Serialization Library - google/flatbuffershttps://github.com/google/flatbuffers 為什么用FloatBuffer&#xff0c…

MySQL其一,概念學習,可視化軟件安裝以及增刪改查語句

目錄 MySQL 1、數據庫的概念 2、數據庫分類 3、MySQL的安裝 4、安裝過程中的問題 DataGrip的使用&#xff1a; SQLynx的使用&#xff1a; 5、編寫SQL語句 6、DDL語句 7、DML 新增數據&#xff1a; 刪除數據&#xff1a; 修改數據&#xff1a; MySQL SQL其實是一門…

05 在 Linux 使用 AXI DMA

DMA簡介 DMA 是一種采用硬件實現存儲器與存儲器之間或存儲器與外設之間直接進行高速數據傳輸的技術&#xff0c;傳輸過程無需 CPU 參與&#xff08;但是CPU需要提前配置傳輸規則&#xff09;&#xff0c;可以大大減輕 CPU 的負擔。 DMA 存儲傳輸的過程如下&#xff1a; CPU 向…

linux 安裝 vsftpd 服務以及配置全攻略,vsftpd 虛擬多用戶多目錄配置,為每個用戶配置不同的使用權限

linux 安裝 vsftpd 服務以及配置全攻略&#xff0c;vsftpd 虛擬多用戶多目錄配置&#xff0c;為每個用戶配置不同的使用權限。 linux 安裝 vsftpd 服務以及配置全攻略 FTP 是 File Transfer Protocol 的簡稱&#xff0c;用于 Internet 上的控制文件的雙向傳輸。同時&#xff0…

SQL語句在MySQL中如何執行

MySQL的基礎架構 首先就是客戶端&#xff0c;其次Server服務層&#xff0c;大多數MySQL的核心服務都在這一層&#xff0c;包括連接、分析、優化、緩存以及所有的內置函數&#xff08;時間、日期、加密函數&#xff09;&#xff0c;所有跨存儲引擎功能都在這一層實現&#xff1…