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;
- }
- }
- 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;
- }
- }
- 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());
- }
- }
- //观察者的封装
- 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() {
- }
- }
- 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);
- }
- 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层
- 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("异常了");
- }
- });*/
- }
- }