简单上手的Retrofit2+Rxjava2网络请求框架

来源:互联网 发布:mac系统与ios系统 编辑:程序博客网 时间:2024/06/01 09:02

一.简单上手的Retrofit网络请求框架

Retrofit是Square公司的一个高效率HTTP网络请求开源库,使用它方便简洁 能够更好的帮助我们提高写代码的质量

retrofit gitHub项目地址:https://github.com/square/retrofit
retrofit 官网地址:http://square.github.io/retrofit/

文件配置使用

   <uses-permission android:name="android.permission.INTERNET"/>//权限配置
    compile 'com.squareup.retrofit2:retrofit:2.3.0' //retrofit    compile 'com.squareup.retrofit2:converter-gson:2.0.2'//使用gson解析对象

使用 retrofit2时 里边已经封装了 okhttp 所以当引用okhttp3时无需在gradle中导入okhttp 很方便
converter-gson 把解析的response.body()转换为bean对象 代码中有用到 addConverterFactory (GsonConverterFactory.create()) ,这里出了converter-gson 官网还提供了其它的对象转化解析

这里写图片描述

其中 addConverterFactory(ScalarsConverterFactory.create())
compile ‘com.squareup.retrofit2:converter-scalars:2.3.0’ 服务器返回的格式是字符串 如果想查看后台返回的原始json未被转化成对象的可添加这段代码使用如下:

@GET(“oil/region”)
Call show(….); 解析创建Retrofit 对象并调用.. return—> String s = response.body().toString();


Simple Demo 如下:
1定义接口方法

public interface IBiz{@GET("oil/region")Call<JiaYouZhan> show(@Query("city") String city, @Query("keywords") String kewords, @Query("page") String limit, @Query("format") String format, @Query("key") String key);@POST("oil/region")@FormUrlEncodedCall<JiaYouZhan> getTransData(@FieldMap Map<String, String> map);}

2接口方法调用
Retrofit2 的baseUlr 必须以 /(斜线) 结束

String url = "http://apis.juhe.cn/";//若使用GsonConverFactiry  就要用squareup 封装的jsonRetrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create()).build();IBiz biz = retrofit.create(IBiz.class);//  异步请求 enqueue   get 调用方法 Call<JiaYouZhan> call=biz.show("北京", "石油", "1", "1", "b07bf762d0671b3509f5230f569e1e8f"); call.enqueue(new Callback<JiaYouZhan>()  {      @Override      public void onResponse(Call<JiaYouZhan> call, Response<JiaYouZhan> response){      JiaYouZhan jiaYouZhan=response.body();      Log.e("TAG", "=:" + jiaYouZhan.getResult().getData().get(1).getAddress() );      }      @Override       public void onFailure(Call<JiaYouZhan> call, Throwable t) {            }        }); //Post调用使用方法  Map<String,String>map=new HashMap<>();    map.put("city","北京");    map.put("keywords","石油");    map.put("page","1");    map.put("format","1");    map.put("key","b07bf762d0671b3509f5230f569e1e8f");    baseRequest.createService(QuestService.class).getTransData(map).enqueue(...);//取消订阅call.cancle();

1.Get请求

@GET("oil/region")Call<JiaYouZhan> show(@Query("city") String city, @Query("keywords") String kewords,   @Query("page") String limit, @Query("format") String format, @Query("key") String key);   

注解
完整路径 如下: 这里我用的是聚合的免费试用接口
http://apis.juhe.cn/oil/region?city=""&keywords="" &page=1&format=1&key=""
(@Query(“city”) String city)–>查询参数并设置参数(Query(“city”))的值(String city)


@GET("api/myplan/{userid}")Call<HomeBean> shouYe(@Path("userid") String userId, @Query("page") String responseType, @Query("limit") String limit);

如果完整路径
http://www.ceshi.com/api/plan/10006?page=1&limit=5
这里对应的参数分别是userid=10006 ,page=1 ,limit=5 这里有三个参数其中userid是个path路径则可以这么写
(@Path(“userid”) String userId)补全{ }里的路径 ,?后面的参数采取查询Query 方式

2.Post请求

当请求的参数少时可以采用此方式

@POST("oil/region")@FormUrlEncodedCall<JiaYouZhan> postshore(@Field("city") String city, @Field("keywords") String kewords, @Field("page") String limit, @Field("format") String format, @Field("key") String key);

当提交的参数较多时采用map 集合上传参数

@POST("oil/region")@FormUrlEncodedCall<JiaYouZhan> getTransData(@FieldMap Map<String, String> map);

这里的 Call<T> 实际上是个泛型接口 里边就6个方法 ,默认 T 是ResponseBody 类型即Call<ResponseBody> 但也可以是其他类型 .当然call 也可以被替换成 Observable<JiaYouZhan> 但是要配合Rxjava 使用才行

Response<T> execute() throws IOException;void enqueue(Callback<T> callback);  void cancel(); boolean isCanceled();all<T> clone(); Request request();

二.Retrofit2 和Rxjava2配合使用

除了以上的 gradle compile 另外还需要添加

    //这个是将服务器返回的结果以字符串形式打出    compile 'com.squareup.retrofit2:converter-scalars:2.3.0'    //rxjava    compile "io.reactivex.rxjava2:rxjava:2.1.0"   // 配合Rxjava 一定要在retrofit 配置支持    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'//retrofit    //retrofit 线程调度配置需要引入改编译的gradle    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

定义接口方法:
当配置完成后稍微修改以上的代码之前没引入rxjava2 是call<> 引入完可以替换成Observable<>

public interface IBiz{@GET("oil/region")Observable<JiaYouZhan> show(@Query("city") String city, @Query("keywords") String kewords, @Query("page") String limit, @Query("format") String format, @Query("key") String key); }

代码调用:

String url = "http://apis.juhe.cn/";Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(ScalarsConverterFactory.create()).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();IBiz biz= retrofit.create(IBiz.class);biz.show("北京", "石油", "1", "1", "b07bf762d0671b3509f5230f569e1e8f"). subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<JiaYouZhan>() {@Overridepublic void onSubscribe(@NonNull Disposable d) {}@Overridepublic void onNext(@NonNull JiaYouZhan jiaYouZhan) {Log.e("TAG", "=======:" + jiaYouZhan.getResult().getData().get(1).getAddress() + "");System.out.print(jiaYouZhan.getResultcode()); } @Overridepublic void onError(@NonNull Throwable e) {} @Overridepublic void onComplete() {} });

RxJava2CallAdapterFactory.create()支持rxjava
observerOn(Schedulers) 指定观察者Observer在哪个线程执行
subscribeOn(Scheduler) 指定被观察者Observable在哪个线程执行
这里我的代码是指定observeOn(AndroidSchedulers.mainThread()) 它的Observer 回调onnext方法里是可以操作ui线程的如不制定会报错

下载地址:>http://download.csdn.net/download/bxllove/10135656

原创粉丝点击