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