Retrofit+MVP框架封裝記錄篇


 

當下最流行的網絡請求組合,retrofit2+okhttp+rxjava+mvp

這里是封裝記錄篇

首先分模塊,比如登錄

先來說封裝后的使用

package com.fragmentapp.login.presenter;

import android.util.Log;

import com.fragmentapp.base.BasePresenter;
import com.fragmentapp.http.BaseObserver;
import com.fragmentapp.http.BaseResponses;
import com.fragmentapp.login.bean.LoginDataBean;
import com.fragmentapp.login.imple.ILoginModel;
import com.fragmentapp.login.imple.ILoginView;
import com.fragmentapp.login.model.LoginModel;

/**
 * Created by liuzhen on 2017/11/3.
 */

public class LoginPresenter extends BasePresenter {

    private ILoginView view;
    private ILoginModel model;

    public LoginPresenter(ILoginView view){
        this.view = view;
        model = new LoginModel();
    }

    public void login(String username,String pwd){
        model.login(observer,username,pwd);
    }

    BaseObserver<BaseResponses<LoginDataBean>> observer = new BaseObserver<BaseResponses<LoginDataBean>>(){

        @Override
        public void onNextResponse(BaseResponses<LoginDataBean> loginDataBean) {
            Log.e("token",loginDataBean.getData().getHCACCESSTOKEN()+"");
            view.success(loginDataBean.getData());
        }

        @Override
        public void onErrorResponse(BaseResponses<LoginDataBean> loginDataBean) {
            view.error();
        }

        @Override
        public void onNetWorkError(String val) {
            view.error();
        }
    };

}
Presenter

通過p層的接口來交互,model去訪問網絡請求,然后返回結果回調返回到view層去刷新

這里自定義了一個base的obsever類,避免多次的傳遞接口

model則負責調用網絡請求了

package com.fragmentapp.login.model;

import com.fragmentapp.http.BaseObserver;
import com.fragmentapp.http.BaseResponses;
import com.fragmentapp.http.RetrofitHelper;
import com.fragmentapp.login.bean.LoginDataBean;
import com.fragmentapp.login.imple.ILoginModel;

import java.util.HashMap;
import java.util.Map;

import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

/**
 * Created by liuzhen on 2017/11/7.
 */

public class LoginModel implements ILoginModel {

    @Override
    public void login(final BaseObserver<BaseResponses<LoginDataBean>> observer,String username,String pwd) {
        Map<String, String> map = new HashMap<>();
        map.put("account[username]", username);
        map.put("account[password]", pwd);
        RetrofitHelper.getInstance().getService()
                .login(map)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
    }

}
View Code

view層的回調也只有兩個接口,可以根據自己的需求添加

package com.fragmentapp.login.imple;

import com.fragmentapp.login.bean.LoginDataBean;

/**
 * Created by liuzhen on 2017/11/6.
 */

public interface ILoginView {

    void success(LoginDataBean dataBean);
    void error();

}
View Code

訪問網絡后直接在activity里處理回調的結果刷新界面等

這里的retrofit的訪問url是用的添加頭部tag來達到動態訪問替換baseurl的目的

然后接口參數采用map的方式添加,個人感覺一個個分開來跟煩,每次都得改service類

然后observable套用了一層類型,這里主要是后台數據格式吭,可以去掉

package com.fragmentapp.http;

/**
 * Created by liuzhen on 2017/11/3.
 */

public class BaseResponses<T> {

    private String info;
    private int status;
    private T data;

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
View Code

然后是base的observer類,在里面根據自己的業務去回調自定義的接口,這樣就不用每次重載這么多的方法了

package com.fragmentapp.http;

import android.os.Looper;
import android.util.Log;

import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

/**
 * Created by liuzhen on 2017/11/3.
 */

public abstract class BaseObserver<T extends BaseResponses> implements Observer<T> {
    String TAG = getClass().getSimpleName();

    @Override
    public void onSubscribe(Disposable d) {
        Log.e(TAG, "onSubscribe");
    }

    @Override
    public void onNext(T t) {
        Log.e(TAG, "onNext"+t);
        if (t.getStatus() == 200) {
            onNextResponse(t);
        } else {
            Log.e(TAG, "ErrorStatus:" + t.getStatus() + "ErrorInfo" + t.getInfo());
            onErrorResponse(t);
        }
    }

    @Override
    public void onError(Throwable e) {
        Log.e(TAG, "onError" + e.toString());
        onNetWorkError("onError 網絡超時,請重新嘗試--"+e.getMessage());
        if (Looper.myLooper() == null) {
            Looper.prepare();
            Log.e(TAG,"onError 網絡超時,請重新嘗試");
            Looper.loop();
        }

    }

    @Override
    public void onComplete() {
        Log.e(TAG, "onComplete");
    }

    /**返回成功*/
    public abstract void onNextResponse(T t);
    /**接口失敗信息*/
    public abstract void onErrorResponse(T t);
    /**網絡錯誤*/
    public abstract void onNetWorkError(String val);
}
View Code

這個沒啥好說的了

封裝好了添加東西也就方便許多了,前面的工作不就是為了后期的迭代方便嗎

比如添加一個dialog加載框,首先先添加兩個回調方法

然后統一在observer里調用接口方法

 

只需要在presenter層的回調的統一調用就行了,在view層完全不用理會,而且邏輯的控制也能很好的添加,然后在view層實現方法,在方法里去調用dialog的show方法

至於這里的dialog是自己自定義了一個簡單的progress控件,然后在base里面去操作的,這樣在view加載的時候直接調用方法就行了,這里是和空頁面一起操作的,空頁面有專門寫,在上一篇

 

效果如下圖

 

 

GitHub:https://github.com/1024477951/FragmentApp

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM