dagger2,Retrofit,Rxjava,mvp最佳实践

原料:

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的话,我再放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值