MVP+Rxjava+Retrofit网络框架

先来简单了解下mvp模式,mvp是由model、view和presenter构成。model负责处理数据模型,view负责给视图控件view提供接口,presenter将model和view联系起来。如图:
这里写图片描述

retrofit对okhttp进行了封装,简化了好多代码,不得不说,真是很棒!我这里主要用retrofit进行网络请求,用rxjava处理网络请求的回调;

这是我的项目目录:
这里写图片描述

如何单独的使用retrofit和rxjava我就不说了,相信很多同学都已经很清楚了。

我做的的一个简单的登录demo。项目由API(接口(retrofit形式的uri))层、interface(网络回调的接口)层、model(数据模型)层、presenter(将view和model联合起来)层、request(网络请求的管理类)层、view(给view控件提供接口)层,构成。

Api接口

public interface Apis<T> {
    @POST("yq/login")
    Observable<T> login(@Query("username") String username, @Query("password") String password);

    public String baseUrl = "";
}

网络回调ResponseNetWorkInterface 接口

/**
 * 
 * 处理网络返回数据的接口
 */

public interface ResponseNetWorkInterface<T> {
    public void onStart(int resquestTag);
    public void onError(Throwable t,int resquestTag);
    public void onCompleted(int resquestTag) ;
    public void onNext(T t,int resquestTag) ;
}

自定义观察者,给网络回调提供入口,requesTag是请求标识用来区分请求

public class MySubscriber extends Subscriber<BaseModel> {
    private ResponseNetWorkInterface responseNetWorkInterface;
    private int resquestTag;
    public MySubscriber(ResponseNetWorkInterface responseNetWorkInterface,int resquestTag){
        this.responseNetWorkInterface = responseNetWorkInterface;
        this.resquestTag = resquestTag;
    }

    @Override
    public void onStart() {
        responseNetWorkInterface.onStart(resquestTag);
    }

    @Override
    public void onCompleted() {
        responseNetWorkInterface.onCompleted(resquestTag);
    }

    @Override
    public void onError(Throwable e) {
        responseNetWorkInterface.onError(e,resquestTag);
    }

    @Override
    public void onNext(BaseModel baseModel) {
        responseNetWorkInterface.onNext(baseModel,resquestTag);
    }
}

model数据模型,这里就列出一个

public class BaseModel<T> implements Serializable{
    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    private int code;
    private String msg;
}

presenter

public class BaseModel<T> implements Serializable{
    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    private int code;
    private String msg;
}

presenter实现ResponseNetWorkInterface接口处理回调,并将view数据引进过来,通过NetWorkManager.getNewWorkManger().request(this,requestTag,loginInforInterface)这句代码请求网络,参数在loginInforInterface里封装着;

public class LoginPresenter implements ResponseNetWorkInterface<LoginBase> {
    private LoginInforInterface loginInforInterface;
    public LoginPresenter(LoginInforInterface loginInforInterface){
        this.loginInforInterface = loginInforInterface;
    }

    /**
     * 登录
     * @param requestTag
     */
    public void login(int requestTag){
        NetWorkManager.getNewWorkManger().request(this,requestTag,loginInforInterface);
    }

    @Override
    public void onStart(int resquestTag) {

    }

    @Override
    public void onError(Throwable t, int resquestTag) {

    }

    @Override
    public void onCompleted(int resquestTag) {

    }

    @Override
    public void onNext(LoginBase loginBase,int resquestTag) {

    }
}

request管理网络请求,创建一个单例的网路请求入口,创建时就将retrofit相关注册完成,通过调用request实现网络请求

public class NetWorkManager {
    public static NetWorkManager netWorkManager;
    private Retrofit retrofit;
    private Apis apis;
    private NetWorkManager(){
        //初始化把retrofit和rxjava结合起来
        retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .baseUrl(Apis.baseUrl)
                .build();
        apis = retrofit.create(Apis.class);
    }

    /**
     * 创建一个单例的网路请求入口
     * @return
     */
    public static NetWorkManager getNewWorkManger(){
        synchronized (NetWorkManager.class){
            if(netWorkManager==null){
                netWorkManager = new NetWorkManager();
            }
        }
        return netWorkManager;
    }

    /**
     *
     * @param responseNetWorkInterface
     * @param requestTag
     * @param loginInforInterface
     * @param <T>
     * @return
     */
    public <T extends BaseModel> Subscriber request(ResponseNetWorkInterface<T> responseNetWorkInterface, int requestTag, LoginInforInterface loginInforInterface){
        MySubscriber mySubscriber = new MySubscriber(responseNetWorkInterface,requestTag);
        apis.login(loginInforInterface.getUserName(),loginInforInterface.getPassWord())
        .subscribeOn(Schedulers.io())
        .map(new BaseFunc<T>())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(mySubscriber);
        return  mySubscriber;
    }

}

view接口

public interface LoginInforInterface {
    public String getUserName();
    public String getPassWord();
}

主activity代码非常简洁通过LoginPresenter loginPresenter = new LoginPresenter(this);
loginPresenter.login(1);就实现了网络请求

public class MainActivity extends AppCompatActivity implements LoginInforInterface{
    private EditText et_name;
    private EditText et_password;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_name = (EditText)findViewById(R.id.et_name);
        et_password = (EditText)findViewById(R.id.et_password);
    }
    //登录
    public void login(View v){
        LoginPresenter loginPresenter = new LoginPresenter(this);
        loginPresenter.login(1);
    }

    @Override
    public String getUserName() {
        return et_name.getText().toString();
    }

    @Override
    public String getPassWord() {
        return et_password.getText().toString();
    }

}

gradel配置:

compile 'io.reactivex:rxjava:x.y.z'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'

总结:mvp模式让代码清晰整洁了很多,但本人感觉用起来,不是很舒服,有点小麻烦,retrofit只能说是相当好用,推荐大家使用。

项目地址:

http://download.csdn.net/detail/u012911421/9796784

MVP(Model View Presenter)其实就是一种项目的整体框架,能让你的代码变得更加简洁,说起框架大家可能还会想到MVC、MVVM。由于篇幅原因,这里我们先不讲MVVM,先来看一下MVC。其实Android本身就采用的是MVC(Model View Controllor)模式、其中Model指的是数据逻辑和实体模型;View指的是布局文件、Controllor指的是Activity。对于很多Android初学者可能会有这样的经历,写代码的时候,不管三七二十一都往Activity中写,当然我当初也是这么干的,根本就没有什么框架的概念,只要能实现某一个功能就很开心了,没有管这么多。当然项目比较小还好,一旦项目比较大,你会发现,Activity所承担的任务其实是很重的,它既要负责页面的展示和交互,还得负责数据的请求和业务逻辑之类的工作,相当于既要打理家庭,又要教育自己调皮的孩子,真是又当爹又当妈。。。那该怎么办呢?这时候Presenter这个继父来到了这个家庭。Presenter对Activity说,我来了,以后你就别这么辛苦了,你就好好打理好View这个家,我专门来负责教育Model这孩子,有什么情况我会向你反映的。这时Activity流下了幸福的眼泪,从此,Model、View(Activity)、Presenter一家三口过上了幸福的生活。。。好了磕个药继续,由于Presenter(我们自己建的类)的出现,可以使View(Activity)不用直接和Model打交道,View(Activity)只用负责页面的显示和交互,剩下的和Model交互的事情都交给Presenter做,比如一些网络请求、数据的获取等,当Presenter获取到数据后再交给View(Activity)进行展示,这样,Activity的任务就大大减小了。这便是MVP(Model 还是指的数据逻辑和实体模型,View指的是Activity,P就是Presenter)框架的工作方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值