Retrofit和OkHttp的簡單配合使用
阿新 • • 發佈:2019-02-08
在我們的請求網路中,有多種網路請求方式,那麼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層也只需要實現一下自己的介面,就可以獲得成功和失敗的資料~~