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("异常了");
            }
        });*/


    }
}




猜你喜欢

转载自blog.csdn.net/l6666_6666/article/details/80003538