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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值