ToB企服应用市场:ToB评测及商务社交产业平台

标题: 一种清晰, 便于扩展android项目架构方案 [打印本页]

作者: 东湖之滨    时间: 2024-6-11 08:40
标题: 一种清晰, 便于扩展android项目架构方案
以下对上面的布局举行说明
core 目次

服务于整个工程,一些基础代码。关于系统配置,用户信息等数据的操纵全部放在这个里面。

features目次

按业务模块来划分不同的包,组织在该目次下。以下对代码的组织做一些说明
login模块

在上面的目次中,由于涉及到用户登录相关的DAO操纵都已经放到core目次下了, 假设可以满意要求,那么login模块下只有UI相关文件和ViewModel,xxxViewModelFactory
product模块

这个模块是用来模拟某个模块下多个页面的场景。以商品列表页和详情页为例。由于DAO的操纵可能会有重叠的场景,这里将它们的数据操纵写在一起。UI层面按功能再分为list, detail两个包。list, detail两个页面的ViewModel可以接纳同一个ViewModelFactory来创建。

personal模块

personal模块中也会涉及到用户相关的信息,这也就是为什么一开始计划把用户相关信息的dao操纵放到core目次下。personal模块下的xxViewModel如果要查用户相关的信息,可以直接调用core下面的UserRepository
至此,整个项目的大体架构便梳理完成了。接纳这种方案将代码以功能模块举行划分,方便后期的维护。既使后续某个模块中举行了技术方案的改革,也能保证其影响的粒度最小。当然这里面重要是为了说明项目的重要布局,在现实项目中,除了这些,我们还会有adapter, 本身写的各种工具等等,这个就根据现实情况再本身分包了。接下来我们看一下涉及到的相关技术栈
技术栈

在这种项目架构中我们重要用到的技术栈有Jetpack中的ViewModel, ViewModelFactory, LiveData, ROOM,下面简单介绍一下这几种技术以及它们之间的整合。当然用于网络请求相关的我们可以用Okhttp, retrofit,此处就不介绍。
ViewModel

Jetpack组件中提供了ViewModel可以方便的将数据,对象与组件的生命周期绑定起来,方便举行组件间的数据共享,如一个activity中多fragment的情况。同时它可以有效的从架构层面上举行解藕,和mvp架构模式相比,可以大大减少接口/方法的个数。以登录为例,用户调用登录接口时必要调用presenter.login方法,login乐成后调用 view.loginSuccess方法。而接纳ViewMode后,用户在登录时调用viewModel.login方法,登录乐成后,更新ViewModel中的LiveData,然后在调用处观察LiveData做相应的举动就可以。
ViewModelProvider.Factory

用来创建ViewModel,ViewModel不可以本身创建,必须要借助ViewModelProvider.Factory来创建。在创建时通常为ViewModel指定数据堆栈,如下:
public class LoginViewModelFactory implements ViewModelProvider.Factory {
@NonNull
@Override
public T create(@NonNull Class modelClass) {
if (modelClass.isAssignableFrom(LoginViewModel.class)) {
return (T) new LoginViewModel(LoginRepository.getInstance(new LoginDataSource()));
} else {
throw new IllegalArgumentException(“Unknown ViewModel class”);
}
}
}
LiveData

在数据发生变化时,必要通知给页面。通常可以接纳接口的方工去做,但如果要观察的数据很多,就必要界说大量的接口,代码会十分冗余。为此, Google提供了LiveData组件,它是一个可被观察的数据容器类,将数据包装起来,使数据成为被观察者,当该数据发生变化时,观察者能获得通知。
ViewModel是用来存储数据,LiveData的作用是在ViewModel发生变化时通知页面。因此, LiveData通常放在ViewModel中利用,用于包装ViewModel中那些必要被外界观察的数据。
我们来联合具体的例子(登录)看这三者的配合利用
示例

UI层面(LoginActivity)

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityLoginBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());

viewModel = new ViewModelProvider(this, new LoginViewModelFactory()).get(LoginViewModel.class);
registerObserver();
bindClickEvent();
}
private void registerObserver() {
viewModel.getLoginResult().observe(this, new Observer() {
@Override
public void onChanged(LoginResult loginResult) {
if (loginResult.success) {
//登录乐成
}
}
});
//出现异常
viewModel.exceptionLiveData.observe(this, new Observer() {
@Override
public void onChanged(AppException e) {
Toast.makeText(LoginActivity.this, e.getBizMsg(), Toast.LENGTH_SHORT).show();
}
});
}
private void bindClickEvent() {
binding.btnLogin.setOnClickListener(v-> {
viewModel.login(phone, pwd, verifyCode, verifyKey);
});
}

ViewModel

public class LoginViewModel extends BaseViewModel {

private MutableLiveData loginResult = new MutableLiveData<>();
private LoginRepository loginRepository;
LoginViewModel(LoginRepository loginRepository) {
this.loginRepository = loginRepository;
}
public LiveData getLoginResult() {
return loginResult;
}
public void login(String username, String password, String verifyCode, String verifyKey) {
loginRepository.login(username, password, verifyCode, verifyKey, new Gson2ModelCallback<NetResult>() {
@Override
public void onSuccess(NetResult result) {
//乐成
if (“SUCCESS”.equals(result.getCode())) {
loginResult.postValue(new LoginResult(result.getData()));
}
}
@Override
public void onFail(Throwable e) {
handleException(e);
}
});
}
}
其功能是调用repository相关的业务方法去拿数据,拿到数据后通过postValue方法再通报给ViewModel
Repository

Repository层便会调用具体的数据源去加载数据,这里就不详情说明。Repository在创建ViewModel的时候就已经注入了。
至此,该方案主体布局基本描述完备。至于里面再细节一些的方案,就根据具体的项目现实情况来安排。好比,还要不要用Rxjava, 要不要引入Retrofit, 不同模块的开发负责人可以本身安排,以模块的粒度来组织代码,就再不用担心别人模块中的乱代码恶心到你了,你可以在本身负责的模块中享有最大的技术自由度。哪怕你后面在本身负责的模块中就不想用mvvm架构,你的计划思绪影响的范围也只是在本身负责的模块,项目中的别的模块还是依旧保持整洁同等的布局。
参考



自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是本身探索发展大概是报班学习,但对于培训机构动则近万的学费,着实压力不小。本身不成体系的自学效果低效又漫长,而且极易遇到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初志也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋侪,同时减轻各人的负担。





既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目次截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、解说视频,而且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后

愿你有一天,真爱本身,善待本身。
《互联网大厂口试真题剖析、进阶开发核心学习笔记、全套解说视频、实战项目源码讲义》点击传送门即可获取!





欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4