1. 程式人生 > >Retrofit和OkHttp的簡單配合使用

Retrofit和OkHttp的簡單配合使用

在我們的請求網路中,有多種網路請求方式,那麼Retrofit和OkHttp兩種網路請求方式也是能一起配合使用的,Retrofit和OkHttp都是由Square公司釋出的,Retrofit的底層封裝的是OkHttp,我在這用的是MVP模式,封裝一個網路請求~~

自定義的工具類

public class RetrofitUtils {
    //單例模式
    private static volatile RetrofitUtils instance;
    private final Call<AllBean> call;
    //通過穿的引數形式進行網路請求
    private
RetrofitUtils(Map<Object,Object> map,String uri){ //建立OkHttp網路請求物件 OkHttpClient build1 = new OkHttpClient.Builder().build(); //建立一個Retrofit的建立物件 Retrofit build = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) //通過這個方法將Okhttp放進Retrofit中,實現結合使用
.client(build1) .baseUrl(uri) .build(); //APIInterface是我們自定義的介面類,用來拼接地址 APIInterface apiInterface = build.create(APIInterface.class); //呼叫介面方法,返回一個Call物件 call = apiInterface.call(map); }; //單例模式的判斷 public static RetrofitUtils getInstance
(Map<Object,Object> map,String uri){ if(instance == null){ synchronized(RetrofitUtils.class){ if(instance == null){ instance = new RetrofitUtils(map,uri); } } } return instance; } //定義一個方法,用來讓呼叫這個類的物件獲得Call物件 public Call<AllBean> getBuild(){ return call; } }

自定義的介面類,用來拼接地址進行網路請求

public interface APIInterface {
//定義的請求方式
    @GET("你要放置的地址")
    //泛型中放的是返回的Bean類,後面的引數放的是map集合,存放拼接的引數
    Call<AllBean> call(@QueryMap Map<Object,Object> map);
}

M層的程式碼

//M層實現自己的介面
public class Model implements ModelInterface{
    //例項化P層
    private Persent persent;
    public Model(Persent persent){
        this.persent = persent;
    }
    @Override
    public void getData(String uri, Map<Object, Object> map) {
        //通過工具類將建立好的Retrofit物件返回的Bean類取出來
        Call<AllBean> build = RetrofitUtils.getInstance(map, uri).getBuild();
        //呼叫P層的get方法,用來將請求的Call物件傳過去
        persent.get(build);
    }
}

M層的介面類:

public interface ModelInterface {
    //用來傳遞地址和要拼接的引數
    void getData(String uri, Map<Object,Object> map);
}

P層的程式碼塊:

//P層實現本層的介面,用來傳遞要訪問的地址和拼接的引數
public class Persent implements PersentInterface{
    //宣告V層介面,將成功失敗的結果返回
    private ViewInterface viewInterface;
    public Persent(ViewInterface viewInterface){
        this.viewInterface = viewInterface;
    }
    @Override
    public void getData(String uri, Map<Object, Object> map) {
        //將P層物件傳到M層,用多型的方式取到M層的介面方法
        ModelInterface model = new Model(this);
        //將地址和引數通過傳參的形式傳遞
        model.getData(uri,map);
    }
    //定義一個方法,用來接收M層傳遞的Call物件
    public void get(Call<AllBean> bean){
        //通過Call物件非同步請求資料
        bean.enqueue(new Callback<AllBean>() {
            //請求成功
            @Override
            public void onResponse(Call<AllBean> call, Response<AllBean> response) {
                viewInterface.Success(response.body());
            }
            //請求失敗
            @Override
            public void onFailure(Call<AllBean> call, Throwable t) {
                viewInterface.Failed(t.getMessage());
            }
        });
    }
}

P層的介面程式碼:

public interface PersentInterface {
    //定義一個相同的方法用來傳遞引數
    void getData(String uri, Map<Object,Object> map);
}

V層在使用網路請求的時候,只需要例項化P層,然後實現自己的介面,V層的介面方法裡定義的也是一個成功和失敗的方法,V層也只需要實現一下自己的介面,就可以獲得成功和失敗的資料~~