1. 程式人生 > >Retrofit,OkHttp攔截器,RxJava封裝請求網路

Retrofit,OkHttp攔截器,RxJava封裝請求網路

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的封裝類

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;
    }

}
okhttp的封裝類
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, post1
public 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("異常了");
            }
        });*/


    }
}