Retrofit,OkHttp攔截器,RxJava封裝請求網路
阿新 • • 發佈:2019-02-16
Retrofit和Okhttp和RxJava的封裝
匯入依賴
加入許可權compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.1.7' compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-scalars:2.0.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' compile 'com.google.code.gson:gson:2.8.2' compile 'com.squareup.okhttp3:okhttp:3.9.0'
<uses-permission android:name="android.permission.INTERNET" />
先寫幾個公共的封裝類
retrofit的封裝類
okhttp的封裝類public class RetrofitUtils { private static IGetService service = null; //http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10 //單例模式 public static IGetService getInstance(){ if(service==null){ synchronized (RetrofitUtils.class){ if(service==null){ Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://api.tianapi.com") .addConverterFactory(ScalarsConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(OkHttpUtils.getInstance()) .build(); service = retrofit.create(IGetService.class); } } } return service; } }
public class OkHttpUtils { private static OkHttpClient client = null; public static OkHttpClient getInstance(){ if(client==null){ synchronized (OkHttpUtils.class){ if(client==null){ client = new OkHttpClient.Builder() .connectTimeout(2000, TimeUnit.SECONDS) .writeTimeout(2000,TimeUnit.SECONDS) .readTimeout(2000,TimeUnit.SECONDS) .addInterceptor(new LoggingInterceptor()) .addInterceptor(new CommonHeaderInterceptor()) .build(); } } } return client; } }
LoggingInterceptor日誌攔截器的封裝
public class LoggingInterceptor implements Interceptor{
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
Response response = chain.proceed(request);
long t2 = System.nanoTime();
System.out.println(" this request url "+response.request().url()+" "+(t2-t1)/1000000);
return response;
}
}
CommonHeaderInterceptor公共的請求頭攔截器
public class CommonHeaderInterceptor implements Interceptor{
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder builder = request.newBuilder();
builder.addHeader("key","aa");
builder.addHeader("User-Agent","android");
return chain.proceed(builder.build());
}
}
觀察者Observer的封裝
//觀察者的封裝
public abstract class AbstractObserver<T> implements Observer<String> {
//不需要下面重寫的四個方法,只需要自己寫的兩個抽象方法
public abstract void onSuccess(T t);
public abstract void onFailure();
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String result) {
//這裡的s是請求網路傳回來的string字串
Type type = getClass().getGenericSuperclass();
Type[] types = ((ParameterizedType) type).getActualTypeArguments();
Class clazz = (Class) types[0];//強轉成類物件
//使用gson解析
Gson gson = new Gson();
T t = (T) gson.fromJson(result,clazz);
//呼叫抽象方法onSuccess
onSuccess(t);
}
@Override
public void onError(Throwable e) {
onFailure();
}
@Override
public void onComplete() {
}
}
Retrofit的介面
public interface IGetService {
/* @GET("/nba")
Observable<Bean> get(@QueryMap Map<String,String> map);*/
//-----------------------下面用於封裝的請求
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
//返回string字串的請求方法,傳後面整個url
@GET
Observable<String> get1(@Url String url);//過載
@GET
Observable<String> get1(@Url String url,@QueryMap Map<String,String> map);
@FormUrlEncoded
@POST
Observable<String> post1(@Url String url, @FieldMap Map<String,String> map);
@POST
Observable<String> post1(@Url String url);
}
APIFactory.java這個類裡面有對應的四個方法get1, post1public class APIFactory {
//單例模式
private static APIFactory factory = null;
public static APIFactory getInstance(){
if(factory==null){
synchronized (APIFactory.class){
if(factory==null){
factory = new APIFactory();
}
}
}
return factory;
}
//這裡面寫方法.
public void get1(String url, Map<String,String> map, Observer<String> observer){
//呼叫retrofit工具類的方法
RetrofitUtils.getInstance().get1(url, map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public void get1(String url,Observer<String> observer){
RetrofitUtils.getInstance().get1(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public void post1(String url,Map<String,String> map,Observer<String> observer){
RetrofitUtils.getInstance().post1(url,map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public void post1(String url,Observer<String> observer){
RetrofitUtils.getInstance().post1(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
在model層裡面呼叫APIFactory裡面的4個方法get1,post1,
//具體的model層
public class LoginModelImpl {
//model層處理資料,請求網路
public void getData(final LoginModelCallBack loginModelCallBack) {
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
Map<String,String> map = new HashMap<>();
map.put("key","71e58b5b2f930eaf1f937407acde08fe");
map.put("num","10");
/* Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.tianapi.com")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
IGetService service = retrofit.create(IGetService.class);
service.get(map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Bean>() {
@Override
public void accept(Bean bean) throws Exception {
loginModelCallBack.success(bean);
}
});*/
//------------
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
//呼叫apifactory
//傳參map集合
APIFactory.getInstance().get1("/nba", map, new AbstractObserver<Bean>() {
@Override
public void onSuccess(Bean bean) {
// System.out.println("beanget傳參 ="+bean.getNewslist().toString());
}
@Override
public void onFailure() {
// System.out.println("異常了");
}
});
//不傳參,直接傳路徑
APIFactory.getInstance().get1("/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10", new AbstractObserver<Bean>() {
@Override
public void onSuccess(Bean bean) {
// System.out.println("beanget不傳參 ="+bean.getNewslist().toString());
}
@Override
public void onFailure() {
// System.out.println("異常了");
}
});
//不傳參直接傳路徑post
APIFactory.getInstance().post1("/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10", new AbstractObserver<Bean>() {
@Override
public void onSuccess(Bean bean) {
System.out.println("beanpost不帶引數 ="+bean.getNewslist().toString());
loginModelCallBack.success(bean);
}
@Override
public void onFailure() {
System.out.println("異常了");
}
});
/* //傳參 post路徑,不好使
APIFactory.getInstance().post1("/nba", map, new AbstractObserver<Bean>() {
@Override
public void onSuccess(Bean bean) {
System.out.println("beanpost帶引數 ="+bean.getNewslist().toString());
}
@Override
public void onFailure() {
System.out.println("異常了");
}
});*/
}
}