原料:
dagger2Version = "2.5"
rxjava2Version = "2.0.1"
okhttp3Version = "3.6.0"
gsonVersion = "2.8.0"
配置:
//
compile("com.squareup.retrofit2:retrofit:${rootProject.ext.retrofit2Version}") { exclude group: "com.squareup.okhttp3" } compile("com.squareup.retrofit2:converter-gson:${rootProject.ext.retrofit2Version}") { exclude module: "retrofit" }
compile "com.squareup.okhttp3:okhttp:${rootProject.ext.okhttp3Version}"
compile "com.squareup.okhttp3:logging-interceptor:${rootProject.ext.okhttp3Version}"
compile "io.reactivex.rxjava2:rxjava:${rootProject.ext.rxjava2Version}"
compile("io.reactivex.rxjava2:rxandroid:${rootProject.ext.rxjava2Version}") {
exclude module: "android.support"
}
compile "com.google.dagger:dagger:${rootProject.ext.dagger2Version}"
annotationProcessor "com.google.dagger:dagger-compiler:${rootProject.ext.dagger2Version}"
基本就这些
模块接口,以登录模块举例
首先:定义接口
public interface MineContract {
//ui更新
interface View{
void showList(List<Map<String, Object>> list);
void showError(String message);
}
//module刷新
interface presenter{
void getData();
}
}
这两个可以分开定义,不必要放在一起。这两个接口是要干嘛呢?
think in java中有一句话描述接口的:接口规定了可对一个特定的对象发出哪些请求。
interface View是需要activity/fragment来实现的
interface presenter是需要prenester来实现的
2.核心presenter(简单举例)
public class MyFriendPresenter implements MineContract.presenter{
private final MineContract.View view;
private final SharedPreferences sharedPreferences;
private final UserService userService;
private String[] friends = {"至尊宝", "牛魔王", "紫霞仙子"};
private Integer[] img = {R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher};
List<Map<String, Object>> list = new ArrayList<>();
//用来提供Presenter的实例化对象
@Inject
public MyFriendPresenter(MineContract.View view,
@Named("default") SharedPreferences sharedPreferences,
UserService userService) {
//这个其实就是activity
this.view = view;
this.sharedPreferences = sharedPreferences;
this.userService = userService;
}
/**
* 业务逻辑
*/
public void main(){
userService.getUser().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Response<List<String>>>() {
@Override
public void accept(Response<List<String>> listResponse) throws Exception {
for (int i = 0; i < friends.length; i++) {
Map<String, Object> map = new HashMap<>();
map.put("name", friends[i]);
map.put("img", img[i]);
list.add(map);
}
//我这里为了方便使用的临时数据,
//在presenter里获取数据,数据源可以是本地数据库,远程数据库,等
//这个view就是activity引用,请求成功后。执行activity里面的showList()方法进行页面刷新
view.showList(list);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
view.showError(throwable.getMessage());
}
});
}
@Override
public void getData() {
}
}
Component:这个不说了,就是一个纽带,联系依赖和被依赖的关系
核心思想:其实dagger不用也行,但是不使用的话,在activity和presenter之间就是强耦合了。
mvp主要的任务其实就是分解activity的任务,把业务逻辑分离到presenter。然后presenter持有activity的引用。
activity的功能就是ui的刷新。本质上还是接口回调。
接口回调的介绍:
先定义一个接口:
接口a{
打太极()
}
//但是不知道该怎么打,需要请教类c
类b 实现 接口a{
类c c=new 类c(b)
打太极(){
c.教打太极()
恭喜你,学会了白鹤亮翅,下一次教你猴子偷桃。
}
}
类c{
类c构造器(类b b){
this.类b=b;
}
public void 教太极(){
b.打太极(第一招(白鹤亮翅) )
}
}
简单的一个伪代码:
继续总结:
presenter就是类c专门教武功,处理业务逻辑。(比较叼,但是不想动,持有类b的引用,让类b去踢馆(即更新页面))
activity就是类b,专门出去踢馆,表示老子又剁掉。(但是武功不行,所以需要c来教)
就这样吧。。需要demo的话,我再放