MVP基类,Retrofit,OkHttp拦截器,RxJava封装

来源:互联网 发布:电子滚动屏幕软件 编辑:程序博客网 时间:2024/06/06 00:53

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