简单上手的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
- 简单上手的Retrofit2+Rxjava2网络请求框架
- 基于RxJava2+Retrofit2的简单易用网络请求框架
- 简单实现RxJava2+Okhttp+Retrofit2的网络请求框架封装
- Retrofit2+Rxjava2网络请求框架的封装
- RxEasyHttp一款基于RxJava2+Retrofit2实现简单易用的网络请求框架
- Android RxJava2+Retrofit2搭建网络请求框架
- RxJava2和Retrofit2实现简单网络请求
- Retrofit2+RxJava2进行网络请求
- RxJava2+Retrofit2网络请求框架封装及使用
- rxjava2+rxandroid2+retrofit2 封装网络请求
- Retrofit2+Rxjava2如何主动取消网络请求
- Retrofit2.0 简单实现的网络请求
- Retrofit2+RxAndroid2进行简单的网络请求
- Rxjava2和Retrofit2网络库的封装
- RxJava2和Retrofit2.0的简单使用
- Android基于Retrofit2.0和RXJava2.0 的HTTPS网络请求搭建
- 简单封装retrofit2+rxjava2
- RxJava2+Retrofit2实现网络请求和解析封装
- mt6735 [Audio Speech]如何在通话中播放音乐/通话背景音
- Python性能优化的20条建议
- R 语言初接触
- MongoDB 删除文档
- 文章标题
- 简单上手的Retrofit2+Rxjava2网络请求框架
- Git安装和使用
- Retrofit response 回调封装
- 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别
- MongoDB 查询文档
- 自己写的打印沙漏(20).cpp
- java中的Cipher类 (加密和解密)
- docker 突然无法启动
- input输入框不可编辑