首页 > 其他分享 >安卓之技术架构优劣分析

安卓之技术架构优劣分析

时间:2023-12-21 13:45:41浏览次数:22  
标签:架构 优劣 void private public class user Override 安卓

文章摘要

  安卓架构技术主要包括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 原则和良好的编程实践,以保持代码的清晰和可维护性。

标签:架构,优劣,void,private,public,class,user,Override,安卓
From: https://www.cnblogs.com/hxznfuture/p/17918795.html

相关文章

  • 安卓逆向工具
    源码地址https://github.com/topjohnwu/Magisk给小米/红米手机roothttps://blog.csdn.net/weixin_73636162/article/details/134043402小米手机的,Magisk面具教https://blog.csdn.net/weixin_73636162/article/details/134043402常用的安卓逆向工具安装https://github.com/c......
  • TFT架构学习
    1.TFT架构图2.各成分概述1)门控机制2)变量选择网络3)静态协变量编码器4)时间处理5)通过分位数预测2.1门控机制-门控残差网络GRN\[GRN_{\omega}(a,c)=LayerNorm(a+GLU_{\omega}(\eta_{1}))\\\eta_{1}=W_{1,\omega}\eta_2+b_{1,\omega}\\\eta_2=ELU(W_{2,\omega}a+W_{3,\ome......
  • 一套分布式IM即时通讯系统的技术选型和架构设计
    本文由冰河分享,作者博客binghe.gitcode.host,原题“这套分布式IM即时通讯系统如何写到简历上?我给你整理好了!”,本文有修订和改动。1、引言分布式IM即时通讯系统本质上就是对线上聊天和用户的管理。针对聊天本身来说,最核心的需求就是:发送文字、图片、文件、语音、视频、消息缓......
  • 1、组织架构图—word
    1、在word里面录入所有的文字2、选中一级的文字,按【Tab】键,降级3、选中二级文字,按【Tab】键,降级4、选中三级文字,按【Tab】键,降级    5、将【布局】—>【纸张方向】—>【横向】,然后【Ctrl+A】全选文字,最后【Ctrl+x】剪切文字,点击【插入】—>【smartart】—>【层次结构......
  • MT6785(MTK6785)_Helio G95安卓核心板规格参数
    MTK6785安卓核心板是一种工业级高性能的4G智能模块,它采用Android9.0操作系统,具备了蓝牙、FM、WLAN和GPS模块的集成。该核心板采用了两个工作频率高达2.0GHz的ARMCortex-A76内核和六个工作频率高达2.0GHz的ARMCortex-A55内核,以及强大的多标准视频编解码器。此外,它还具备广......
  • 腾讯QQ9正式发布!4年来最大更新 安卓/iOS/Windows都能下载了
    12月20日消息,今日,腾讯宣布,QQ9正式上线。距离上一次QQ8版本已经过去了4年。据官方介绍,本次版本更新,QQ9采用了全新的QQNT技术架构驱动,性能升级,交互体验更加流畅。全新界面,流畅社交。首先是UI界面全面优化,QQ启动页、登录页、消息列表页、关于页等页面UI焕彩上线。同时,聊天、设置......
  • transformer总体架构
    transformer总体架构目录transformer总体架构循环神经网络总体架构EncoderDecoder输入输出层模型输入位置编码模型输出自注意力机制关于QKV的理解Q,K,V及注意力计算多头注意力机制多头注意力机制作用FeedForward层参考资料论文地址:AttentionisAllYouNeedhttps://arxiv......
  • 在arm架构的银河麒麟系统部署Nginx
    以下是在arm架构的银河麒麟系统上部署Nginx的详细步骤:1.创建文件夹首先,在合适的位置创建必要的文件夹。在本例中,我们将创建/opt/nginx和/usr/src/nginx两个文件夹。mkdir/opt/nginxmkdir/usr/src/nginx2.准备Nginx及其依赖包切换至/usr/src/nginx目录,并从以下地址下载......
  • 南凌科技推出首款Arm架构SASE BOX,打造5G专网跨域解决方案
    SASE是一种新兴的网络安全架构,旨在为远程用户提供安全的网络访问,简化网络安全设备的部署和管理。在SASE市场,云网基础、全域服务是南凌科技SASE服务的优势所在。南凌科技正凭借优质的平台资源、强大的研发实力、灵活的资源整合能力以及专业的一站式服务在SASE赛道多方势力的竞逐中脱......
  • uniapp app安卓、ios文件选择 (上传pdf word video img )等
    1、hybrid 必须放在项目根目录下,不然会调用失效:如图 2、建立nvue 子窗体  代码:1<template>2<viewclass="nvue">3<textclass="popup-item"@click="clickfun">选择文件</text>4<textclass="ddddd......