安卓之技術架構優劣分析

来源:https://www.cnblogs.com/hxznfuture/archive/2023/12/21/17918795.html
-Advertisement-
Play Games

文章摘要 安卓架構技術主要包括MVC、MVP、MVVM等。下麵分別對這些架構技術進行分析優劣勢,並附上代碼示例。 正文 MVC(Model-View-Controller)架構 MVC是一種常用的軟體架構,它將應用程式分為三個主要組成部分:Model(模型)、View(視圖)和Controller( ...


文章摘要

  安卓架構技術主要包括MVC、MVP、MVVM等。下麵分別對這些架構技術進行分析優劣勢,並附上代碼示例。

正文

MVC(Model-View-Controller)架構

  MVC是一種常用的軟體架構,它將應用程式分為三個主要組成部分:Model(模型)、View(視圖)和Controller(控制器)。MVC架構可以通過將UI組件與業務邏輯分離來實現代碼的模塊化和可維護性。

  在 Android 中,可以使用 MVC 模式將數據模型和控制邏輯放在後端伺服器上,而將用戶界面放在 Android 應用程式中。

優勢

  代碼模塊化:MVC架構將應用程式分為三個部分,使得代碼更加模塊化,易於維護和擴展。

  可重用性:Model和View可以獨立開發,從而實現代碼重用。

劣勢

  代碼複雜度:MVC架構需要更多的代碼和更複雜的結構,因此開發時間和代碼複雜度可能會增加。不適合大型或複雜的項目。

  性能問題:由於Model和View之間的頻繁交互,可能會導致應用程式性能下降。

示例代碼

// Model
public class User {
private String name;
private String email;
// Getters and setters
}
// View
public class UserActivity extends AppCompatActivity {
private TextView nameTextView;
private TextView emailTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
nameTextView = findViewById(R.id.name_text_view);
emailTextView = findViewById(R.id.email_text_view);
}
public void displayUser(User user) {
nameTextView.setText(user.getName());
emailTextView.setText(user.getEmail());
}
}
// Controller
public class UserController {
private UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
public void getUser(int userId, final UserActivity userActivity) {
userService.getUser(userId, new UserService.UserCallback() {
@Override
public void onSuccess(User user) {
userActivity.displayUser(user);
}
@Override
public void onFailure(Throwable t) {
// Handle error
}
});
}
}

 

MVP(Model-View-Presenter)架構

  MVP 模式是 MVC 模式的一種變種,它將控制邏輯從後端伺服器移動到了前端。在 Android 中,可以使用 MVP 模式將數據模型和用戶界面放在 Android 應用程式中,而將控制邏輯放在一個單獨的 Presenter 類中。

  可以使用 MVP 模式將數據模型和用戶界面放在 Android 應用程式中,而將控制邏輯放在一個單獨的 Presenter 類中。

優點

  提高了代碼的可測試性,因為Presenter可以獨立於視圖和模型進行單元測試。

  降低了視圖和模型之間的耦合度。

缺點

  需要編寫更多的介面和類,可能會增加代碼量。

  如果Presenter設計不當,可能會導致Presenter過於龐大和複雜。

示例代碼

// Model
public class User {
private String name;
private String email;
// Getters and setters
}
// View
public interface UserView {
void displayUser(User user);
}
public class UserActivity extends AppCompatActivity implements UserView {
private TextView nameTextView;
private TextView emailTextView;
private UserPresenter userPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
nameTextView = findViewById(R.id.name_text_view);
emailTextView = findViewById(R.id.email_text_view);
userPresenter = new UserPresenter(this);
}
@Override
public void displayUser(User user) {
nameTextView.setText(user.getName());
emailTextView.setText(user.getEmail());
}
}
// Presenter
public class UserPresenter {
private UserService userService;
private UserView userView;
public UserPresenter(UserView userView) {
this.userView = userView;
this.userService = new UserService();
}
public void getUser(int userId) {
userService.getUser(userId, new UserService.UserCallback() {
@Override
public void onSuccess(User user) {
userView.displayUser(user);
}
@Override
public void onFailure(Throwable t) {
// Handle error
}
});
}
}

 

Model-View-ViewModel (MVVM)

  MVVM 模式是一種基於數據綁定的架構模式,它將應用程式分為三個互相交互的組件:模型(Model)、視圖(View)和視圖模型(ViewModel)。它將數據模型和用戶界面分離,並通過 ViewModel 類將它們連接起來。

  在 Android 中,可以使用 MVVM 模式將數據模型和用戶界面放在 Android 應用程式中,而將控制邏輯放在 ViewModel 類中。

優點

  利用數據綁定庫簡化了UI更新,使得UI和業務邏輯之間的關係更加清晰。

  支持雙向數據綁定,使得UI和數據模型之間的交互更加直觀。

  可以在不同的平臺和環境中重用代碼。

缺點

  對開發者的要求較高,需要熟悉數據綁定庫的使用。

  如果過度依賴數據綁定,可能會導致代碼難以理解和維護。

  數據綁定可能會導致性能問題。

示例代碼

// Model
public class User {
private String name;
private String email;
// Getters and setters
}
// ViewModel
public class UserViewModel extends ViewModel {
private MutableLiveData<User> userLiveData;
private UserRepository userRepository;
public UserViewModel() {
userRepository = new UserRepository();
userLiveData = new MutableLiveData<>();
}
public void getUser(int userId) {
userRepository.getUser(userId, new UserRepository.UserCallback() {
@Override
public void onSuccess(User user) {
userLiveData.setValue(user);
}
@Override
public void onFailure(Throwable t) {
// Handle error
}
});
}
public LiveData<User> getUserLiveData() {
return userLiveData;
}
}
// View
public class UserActivity extends AppCompatActivity {
private TextView nameTextView;
private TextView emailTextView;
private UserViewModel userViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
nameTextView = findViewById(R.id.name_text_view);
emailTextView = findViewById(R.id.email_text_view);
userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
userViewModel.getUser(1);
userViewModel.getUserLiveData().observe(this, new Observer<User>() {
@Override
public void onChanged(User user) {
nameTextView.setText(user.getName());
emailTextView.setText(user.getEmail());
}
});
}
}

 

Clean Architecture

優點

  強調關註點分離,將業務邏輯、數據訪問和UI層完全解耦。

  提高了代碼的可讀性、可測試性和可維護性。

缺點

  架構複雜,需要更多的時間和精力來理解和實現。

  對團隊的技術水平和協作能力要求較高。

  Clean Architecture的實現通常涉及到多個層次和組件的交互。

示例代碼

public class MainActivity extends AppCompatActivity {
private MainPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new MainPresenter(new UseCase(new Repository()));
presenter.onViewCreated();
}
}
interface UseCase {
Observable<String> execute();
}
class Repository {
public String getData() {
// 獲取數據
return "Data from repository";
}
}
class MainPresenter {
private UseCase useCase;
public MainPresenter(UseCase useCase) {
this.useCase = useCase;
}
public void onViewCreated() {
useCase.execute().subscribe(new Observer<String>() {
@Override
public void onChanged(String data) {
// 更新UI
}
});
}
}

 

Android Jetpack組件

  Android Jetpack 是一套組件化的架構,可以幫助開發者更高效地構建高質量的 Android 應用程式。包括LiveData、ViewModel、Room(資料庫)、Navigation和Data Binding等。

優點

  提供了一系列的庫和工具,可以幫助開發者更輕鬆地解決常見的安卓開發問題。

  提高了應用的性能、穩定性和安全性。

  鼓勵採用最佳實踐和現代編程範式。

缺點

  需要學習和理解多個組件的功能和使用方法。

  對於一些小型項目,可能引入過多的依賴和複雜性。

代碼示例

@Entity(tableName = "tasks")
public class Task {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "title")
private String title;
public Task(String title) {
this.title = title;
}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public void setId(int id) {
this.id = id;
}
public void setTitle(String title) {
this.title = title;
}
}
//創建一個Room資料庫(Repository):
@Database(entities = {Task.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
public abstract TaskDao taskDao();
private static volatile AppDatabase INSTANCE;
public static AppDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (AppDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, "task_database")
.fallbackToDestructiveMigration()
.build();
}
}
}
return INSTANCE;
}
}
//TaskDao介面:
@Dao
public interface TaskDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
void insert(Task task);
@Update
void update(Task task);
@Delete
void delete(Task task);
@Query("SELECT * FROM tasks")
LiveData<List<Task>> getAllTasks();
}
public class TaskViewModel extends AndroidViewModel {
private TaskDao taskDao;
private LiveData<List<Task>> allTasks;
public TaskViewModel(Application application) {
super(application);
AppDatabase database = AppDatabase.getDatabase(application);
taskDao = database.taskDao();
allTasks = taskDao.getAllTasks();
}
public LiveData<List<Task>> getAllTasks() {
return allTasks;
}
}
//MainActivity中的數據綁定和導航部分
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private NavController navController;
private TaskViewModel taskViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
navController = Navigation.findNavController(this, R.id.nav_host_fragment);
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
NavigationUI.setupWithNavController(bottomNavigationView, navController);
taskViewModel = new ViewModelProvider(this).get(TaskViewModel.class);
binding.setTaskViewModel(taskViewModel);
taskViewModel.getAllTasks().observe(this, new Observer<List<Task>>() {
@Override
public void onChanged(List<Task> tasks) {
// Update UI with the list of tasks
}
});
}
}

 

Flutter架構

  Flutter是一種跨平臺的移動應用開發框架,它提供了自己的UI框架和狀態管理機制。在Flutter中,開發者可以使用Dart語言編寫代碼,構建高性能的、響應式的UI界面。

優勢

  跨平臺性:Flutter支持Android和iOS平臺,減少了開發成本。

  高性能UI:Flutter提供了高性能的UI框架和渲染引擎,提高了應用程式的響應速度和流暢度。

  狀態管理機制:Flutter提供了自己的狀態管理機制,使得開發者可以更好地管理UI狀態和數據流。

劣勢

  學習曲線:Flutter使用Dart語言進行開發,需要開發者學習新的語言和技術棧。

  社區支持:雖然Flutter是一個相對較新的框架,但其社區正在不斷壯大和發展中。

代碼示例

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);  
GeneratedPluginRegistrant.registerWith(FlutterEngine(this));  
}

 

Reactive Architecture with RxJava or Kotlin Coroutines

  Reactive Architecture 是一種響應式編程範式,它可以幫助開發者更高效地處理非同步數據和事件。

優點

  提供了一種處理非同步操作和事件驅動編程的強大工具。

  簡化了複雜的非同步編程,並提高了代碼的可讀性和可維護性。

缺點

  學習曲線較陡峭,尤其是對於不熟悉響應式編程概念的開發者。

  如果使用不當,可能會導致記憶體泄漏和性能問題。

代碼示例

public class MainActivity extends AppCompatActivity {
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text_view);
button = findViewById(R.id.button);
// 創建一個Observable,當按鈕被點擊時發出整數值
Observable<Integer> clickObservable = RxView.clicks(button)
.map(click -> Integer.parseInt(textView.getText().toString()) + 1);
// 訂閱Observable,當有新的值發出時更新TextView
Disposable disposable = clickObservable.subscribe(count -> textView.setText(String.valueOf(count)));
// 當Activity銷毀時取消訂閱,防止記憶體泄漏
RxLifecycleAndroid.bindActivity(this, disposable);
}
}

 

總結

  每種架構模式都有其適用的場景和優缺點。對於小型和簡單的項目,MVC可能是快速開發的最佳選擇。隨著項目的增長和複雜性的增加,MVP和MVVM提供了更好的可測試性和可維護性。而對於大規模和長期維護的項目,Clean Architecture能夠提供更強的結構化和解耦優勢。

  在選擇架構時,應考慮項目的規模、團隊的技術水平、開發速度和長期維護的需求。同時,也要註意避免過度設計,確保架構的選擇與實際需求相匹配。在實施過程中,遵循 SOLID 原則和良好的編程實踐,以保持代碼的清晰和可維護性。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • git教程 代碼托管平臺:git.acwing.com 1 git基本概念 工作區:倉庫的目錄。工作區是獨立於各個分支的。 暫存區:數據暫時存放的區域,類似於工作區寫入版本庫前的緩存區。暫存區是獨立於各個分支的。切換分支不會新創建暫存區。 版本庫:存放所有已經提交到本地倉庫的代碼版本 版本結構:樹結 ...
  • 本文基於內核 5.4 版本源碼討論 在前面兩篇介紹 mmap 的文章中,筆者分別從原理角度以及源碼實現角度帶著大家深入到內核世界深度揭秘了 mmap 記憶體映射的本質。從整個 mmap 映射的過程可以看出,內核只是在進程的虛擬地址空間中尋找出一段空閑的虛擬記憶體區域 vma 然後分配給本次映射而已。 v ...
  • 1、掛載鏡像文件,CentOS-7-x86_64-DVD-1804.iso,並且要處於連接狀態 #光碟掛載至/mntmount /dev/sr0 /mnt #備份yum源文件cd /etc/yum.repos.d/mkdir -p ./bakmv CentOS* ./bak #編緝本地源vim lo ...
  • ssh登錄 作用 在開發時,通常會用Terminal通過ssh登錄到每個伺服器里,打開伺服器終端,以進行開發,通常來說,一個伺服器會給出如下的幾個信息: host IP password 登錄伺服器 基本格式:ssh user@hostname user:用戶名 hostname:IP地址/功能變數名稱 如 ...
  • 問題 在調試接收串口數據的Qt程式中發現,數據存在延遲和粘包現象。下位機發送數據包頻率是100Hz,一包56位元組,波特率115200,在列印port->readAll()的值的時候發現並不是每10ms讀到一包數據,而是大概每50ms左右一次接收到5包數據,在其他電腦上調試,以及下載其他串口助手調試後 ...
  • 一、Mycat-web介紹 Mycat-web(現改名為Mycat-eye)是對Mycat-server提供監控服務,通過JDBC連接對Mycat,MySQL監控,監控遠程伺服器的cpu,記憶體,網路,磁碟等情況的使用。Mycat-web運行過程中需要依賴zookeeper,因此需要先安裝zookee ...
  • Flink是一個分散式系統,需要有效地分配和管理計算資源才能執行流應用程式。它集成了所有常見的集群資源管理器,如Hadoop YARN和Kubernetes,但也可以設置為作為一個獨立的集群運行,甚至作為一個庫。 Flink集群的剖析 Flink運行時由兩種類型的進程組成:一個JobManager和 ...
  • 最近開始體驗FastGPT開源知識庫問答系統,用他們試著開發調試一些小助手。這中間需要使用到Redis,就在自己伺服器上進行了安裝,特此記錄下。 環境說明:阿裡雲ECS,2核8G,X86架構,CentOS 7.9操作系統。 選擇版本 1.打開Redis官網下載頁面,可以選擇需要的版本下載。我這裡選擇 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...