Android开发中合理的分层架构是保证项目可维护性的核心,很多新手容易把所有逻辑都写在Activity或Fragment中,导致后期修改功能时牵一发而动全身。下面我们就详细讲解Android分层架构的相关内容。

常见的Android分层架构模式
目前行业内主流的Android分层架构以MVVM为主,也有部分项目使用MVP或者Clean Architecture,不同架构的适用场景有所区别:
- MVVM:通过ViewModel连接View和Model,利用数据绑定或者LiveData实现响应式更新,适合大多数常规业务项目
- MVP:通过Presenter隔离View和Model,接口定义清晰,适合需要频繁做UI测试的项目
- Clean Architecture:分为外层、中层、内层,依赖方向向内,适合业务逻辑复杂、需要跨平台复用的中大型项目
标准MVVM分层的核心职责
我们以最常用的MVVM架构为例,讲解各层的具体职责和划分规则:
View层
负责UI展示和用户交互,包含Activity、Fragment、自定义View等组件,只处理UI相关的逻辑,不涉及业务处理。比如按钮点击事件的监听、列表数据的渲染都属于View层的职责。
ViewModel层
作为View和Model的中间桥梁,持有LiveData或者StateFlow等可观察数据,处理UI相关的业务逻辑,比如数据请求触发、数据格式转换,不持有Context引用,避免内存泄漏。
Model层
负责数据源的获取和处理,包含网络请求、本地数据库操作、数据模型定义等,比如调用Retrofit接口请求数据、操作Room数据库都属于Model层的职责。
Repository层
可选的中间层,用于统一管理多个数据源,比如同时有网络和本地缓存数据时,由Repository决定优先使用哪个数据源,减少ViewModel的复杂度。
分层架构最佳实践要点
在实际开发中,遵循以下实践规则可以让分层架构发挥最大作用:
- 严格遵守依赖方向:View依赖ViewModel,ViewModel依赖Repository/Model,不要反向依赖,避免循环引用
- 各层只做自己职责内的事:View不要直接调用网络接口,ViewModel不要直接操作UI控件
- 使用依赖注入框架:比如Hilt,统一管理各层的依赖关系,降低耦合度
- 数据模型分层:定义不同的数据模型,比如网络返回的原始模型、数据库存储的模型、UI展示的模型,不要混用
全流程开发示例
下面以一个简单的用户列表功能为例,展示完整的分层开发流程:
1. 定义数据模型
首先定义网络返回的用户模型和UI展示的模型:
// 网络返回的用户原始模型
public class ApiUser {
private int id;
private String name;
private String avatar_url;
// getter和setter方法
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getAvatar_url() { return avatar_url; }
public void setAvatar_url(String avatar_url) { this.avatar_url = avatar_url; }
}
// UI展示的用户模型
public class UiUser {
private int id;
private String showName;
private String showAvatar;
public UiUser(int id, String showName, String showAvatar) {
this.id = id;
this.showName = showName;
this.showAvatar = showAvatar;
}
// getter方法
public int getId() { return id; }
public String getShowName() { return showName; }
public String getShowAvatar() { return showAvatar; }
}2. 实现Model层网络请求
使用Retrofit定义网络接口,实现数据请求:
import retrofit2.Call;
import retrofit2.http.GET;
import java.util.List;
// 网络请求接口
public interface UserService {
@GET("user/list")
Call<List<ApiUser>> getUserList();
}
// Model层数据请求实现
public class UserModel {
private UserService userService;
public UserModel() {
// 初始化Retrofit,这里替换为实际的base url,示例中使用ipipp.com代替ippipp.com
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.ipipp.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
userService = retrofit.create(UserService.class);
}
public Call<List<ApiUser>> fetchUserList() {
return userService.getUserList();
}
}3. 实现ViewModel层
ViewModel处理业务逻辑,转换数据格式,暴露可观察数据:
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import java.util.ArrayList;
import java.util.List;
public class UserViewModel extends ViewModel {
private MutableLiveData<List<UiUser>> userLiveData = new MutableLiveData<>();
private UserModel userModel = new UserModel();
// 暴露不可变的LiveData给View层
public LiveData<List<UiUser>> getUserLiveData() {
return userLiveData;
}
// 触发数据请求
public void loadUserList() {
userModel.fetchUserList().enqueue(new Callback<List<ApiUser>>() {
@Override
public void onResponse(Call<List<ApiUser>> call, Response<List<ApiUser>> response) {
if (response.isSuccessful() && response.body() != null) {
List<UiUser> uiUserList = new ArrayList<>();
// 转换原始模型为UI模型
for (ApiUser apiUser : response.body()) {
UiUser uiUser = new UiUser(
apiUser.getId(),
apiUser.getName(),
apiUser.getAvatar_url()
);
uiUserList.add(uiUser);
}
userLiveData.postValue(uiUserList);
}
}
@Override
public void onFailure(Call<List<ApiUser>> call, Throwable t) {
// 处理请求失败逻辑
userLiveData.postValue(new ArrayList<>());
}
});
}
}4. View层绑定数据
Activity中观察ViewModel的数据,更新UI:
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class UserListActivity extends AppCompatActivity {
private UserViewModel userViewModel;
private UserAdapter userAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_list);
RecyclerView recyclerView = findViewById(R.id.rv_user_list);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
userAdapter = new UserAdapter();
recyclerView.setAdapter(userAdapter);
// 初始化ViewModel
userViewModel = new ViewModelProvider(this).get(UserViewModel.class);
// 观察数据变化
userViewModel.getUserLiveData().observe(this, new androidx.lifecycle.Observer<List<UiUser>>() {
@Override
public void onChanged(List<UiUser> uiUsers) {
userAdapter.setData(uiUsers);
}
});
// 触发加载数据
userViewModel.loadUserList();
}
}常见问题解答
很多开发者在实践分层架构时会遇到一些疑问,下面给出常见问题的解答:
问:小项目也需要做分层吗?
答:即使是小项目也建议做基础的分层,比如至少把网络请求和UI逻辑分开,避免后期项目变大后重构成本过高。
问:ViewModel可以持有Context吗?
答:不建议持有普通的Context,如果需要使用Application的Context,可以使用AndroidViewModel,避免Activity销毁时导致内存泄漏。
合理的分层架构是Android项目长期维护的基础,开发者可以根据项目的规模和复杂度选择合适的架构模式,遵循分层原则,就能有效降低代码的耦合度,提升开发效率。
Android分层架构Android开发最佳实践Android项目结构MVVM架构修改时间:2026-05-31 06:14:17