内容简介:前段时间在天星群中有朋友说到了clean架构。刚好在最近的项目里面我在搭建框架的时候用到了clean,所以在这里就把搭建过程在这里描述一下。Demo在文章末尾。本文侧重于clean的搭建,mvp+rxjava的部分,不做介绍。(咦?我听到有人在问什么是天星群。既然你诚心诚意的发问了,那我就给你们透露一下。天星是一群Android开发者闲的没事干搞的一个博客团队,这是团队博客地址:点这里,这个是粉丝qq群:557247785。欢迎妹子和女装大佬们!)mvp和rxjava基本是现在开发标配,有很多写的比较好的
前段时间在天星群中有朋友说到了clean架构。刚好在最近的项目里面我在搭建框架的时候用到了clean,所以在这里就把搭建过程在这里描述一下。Demo在文章末尾。本文侧重于clean的搭建,mvp+rxjava的部分,不做介绍。
(咦?我听到有人在问什么是天星群。既然你诚心诚意的发问了,那我就给你们透露一下。天星是一群Android开发者闲的没事干搞的一个博客团队,这是团队博客地址:点这里,这个是粉丝qq群:557247785。欢迎妹子和女装大佬们!)
CleanArchitecture
mvp和rxjava基本是现在开发标配,有很多写的比较好的文章。对mvp和rxjava比较熟的同学可以继续往下看了。还不熟的同学可以看看MVP, Rxjava1 , Rxjava2 。
Clean是一种架构的思想,跟MVP一样,解耦就完事儿了。(那一群解耦狂魔,你根本不知道他们究竟想怎样!)关于clean框架的解析很多,我不再赘述,毕竟本文是手把手写一个Demo。
Clean思想由Uncle Bob提出的,英文不错的看这个The Clean Code Blog
Google爸爸写的Demo可以作为参考 todo‑mvp‑clean
android10的文章图解多,比较容易理解,推荐! Android-CleanArchitecture
中文版可以看看来自谷歌清洁工的Clean架构探讨,我觉得讲的很好。
按惯例这里该有一张表情包,但是我没有找到可以皮的理由,所以,算了。
手把手写mvp+rxjava+clean
现在来模拟一个登陆功能。mvp是clean架构的基础,我们先把mvp+rxjava的框架给弄好。我的项目结构是这样的。
分为了data,domain,presentation 三层。分别对应clean的三层。 data层和presentation层大家应该都比较熟悉,就是一些mvp的东西。 那这个domain layout是干嘛的?
业务逻辑,use case实现的地方以前在mvp架构的时候,我们会说。我要是不知道这个app能干嘛,看一眼presenter的接口就知道了。那在clean里面就可以说。我要是不知道这app能干嘛,看一眼domain层就知道了。
usecase更加简化了presenter里面的代码以前presenter里面会调用data层的东西,现在presenter只管负责的usecase。代码量大大的减少。
usecase纯 java 代码,不含androd依赖
那usecase是干嘛的? 看看google官方 todo‑mvp‑clean 里面Usecase在干嘛,又是如何调用的。
Google clean demo核心解析
UseCase
- 抽象类
- 传进来了请求参数Q,相应参数P
- 有一个回调接口UseCaseCallback
- set几个属性的方法。
- run(): 带着Q执行usecase
UseCase实现类
- 构造函数传入了repository
- P,Q两个静态内部类
- executeUseCase():通过传入的repository执行数据请求的操作,并执行回调函数。
UseCaseHandler
- 统一管理Usecase的execute方法。
- 通过execute方法把需要处理的UseCase<T, R>、请求参数T、回调接口UseCase.UseCaseCallback进行绑定,方便请求与回调。
presenter里的使用
使用哪个方法的时候,就调用传入哪个usecase,和请求需要的参数,和相应的回调接口。
我们继续手把手
UseCaseHandler主要作用就是统一管理,回调直观。 当我们把rxjava2加入进来之后,UseCaseHandler就没有存在的意义了。 去掉handler,不需要绑定这杂七杂八的东西之后,usecase可以简化了。所以我的BaseUseCase是这样的
MyUseCase
public abstract class BaseUseCase<P, Q> {
private final Scheduler observerThread;
private final Scheduler subcriberThread;
private final CompositeDisposable disposables;
public BaseUseCase(Scheduler observerThread, Scheduler subcriberThread) {
this.observerThread = observerThread;
this.subcriberThread = subcriberThread;
this.disposables = new CompositeDisposable();
}
protected abstract Observable<Q> buildUseCaseObservable(P request);
public void execute(DisposableObserver<Q> observer, P request) {
Preconditions.checkNotNull(observer);
final Observable<Q> observable = this.buildUseCaseObservable(request)
.subscribeOn(observerThread)
.observeOn(subcriberThread);
addDisposable(observable.subscribeWith(observer));
}
public void dispose() {
if (!disposables.isDisposed()) {
disposables.dispose();
}
}
public void addDisposable(Disposable disposable) {
Preconditions.checkNotNull(disposable);
Preconditions.checkNotNull(disposables);
disposables.add(disposable);
}
}
复制代码
跟google的demo做了一样的事,不过加了CompositeDisposable统一管理而已。
MyUseCase实现类
public class LoginUseCase extends BaseUseCase<LoginUseCase.RequestValue, User> {
private final Repository repository;
public LoginUseCase(Scheduler observerThread, Scheduler subcriberThread, Repository repository) {
super(observerThread, subcriberThread);
this.repository = repository;
}
@Override
protected Observable<User> buildUseCaseObservable(RequestValue request) {
return repository.getUser(request.account, request.password);
}
public static final class RequestValue {
final String account;
final String password;
public RequestValue(String account, String password) {
this.account = Preconditions.checkNotNull(account);
this.password = Preconditions.checkNotNull(password);
}
}
}
复制代码
跟google的demo差不多基本一致,把ResponseValue改成了返回的实体类。
MyPresenter里的使用
@Override
public void login(String account, String password) {
loginUseCase.execute(new LoginObserver(), new LoginUseCase.RequestValue(account, password));
}
private final class LoginObserver extends DisposableObserver<User> {
@Override
public void onNext(User user) { loginUseCase.saveUser(user); }
@Override
public void onError(Throwable e) { }
@Override
public void onComplete() { }
}
复制代码
其他
/*ButterKnife*/
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
/*GreenDao*/
implementation 'org.greenrobot:greendao:3.2.2'
/*Retrofit*/
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.okhttp3:okhttp:3.1.2'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.5.0'
/*Rxjava2*/
implementation 'io.reactivex.rxjava2:rxjava:2.1.3'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
复制代码
全部源码在这里: github.com/GuitarDian/…
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective JavaScript
David Herman / Addison-Wesley Professional / 2012-12-6 / USD 39.99
"It's uncommon to have a programming language wonk who can speak in such comfortable and friendly language as David does. His walk through the syntax and semantics of JavaScript is both charming and h......一起来看看 《Effective JavaScript》 这本书的介绍吧!
CSS 压缩/解压工具
在线压缩/解压 CSS 代码
随机密码生成器
多种字符组合密码