Android Retrofit2.0+RxJava简单示例
来源:互联网 发布:plc编程软件for mac 编辑:程序博客网 时间:2024/05/19 01:09
Android Retrofit2.0+RxJava简单示例
- Retrofit简介
- RxJava简介
- Retrofit+RxJava简单示例
- 如何简单GET一个api数据
目录
- Android Retrofit20RxJava简单示例
- 目录
- Retrofit简介
- RxJava简介
- RetrofitRxJava简单示例
- 如何简单GET一个api数据
- 寻找api地址
- 分析JSON格式
- Retrofit的封装
- RxJava的封装
- 请求数据
- 将请求到的数据显示
Retrofit简介
Retrofit是Square公司针对安全请求HTTP并解析JSON数据所开发的一个网络数据加载库,其适用于Java和Android。主要功能包括GET请求,POST请求。其特点简单安全。详细了解Retrofit
RxJava简介
RxJava是一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库,简单理解就是一个处理异步的开源库。对于异步的处理很多开发者就会情不自禁的想到 AsyncTask / Handler / XXX / … 。但是其处理起来麻烦并且对整体的代码整洁性有很多的影响很大,那相比较下RxJava就显得简洁明了,并且其变换线程的处理也受到了很多程序员的青睐。详细了解RxJava
Retrofit+RxJava简单示例
既然说了那么多优点那就来看看其写出来是不是简洁明了,这就是封装后使用,看起来是不是简洁明了,具体的内容,之后详解,此代码主要就是展示一下其代码风格
addSubscription(apiStores.loadSchedule(user.getData().getStudentKH(), user.getRemember_code_app()), new ApiCallback<Schedule>() { @Override public void onSuccess(Schedule model) { if (model.getMsg().equals("ok")) { //请求成功并获取到数据 } else { //请求成功,但返回结果出错 } } @Override public void onFailure(String msg) { //请求出错 } @Override public void onFinish() { //请求完成 } });
如何简单GET一个api数据
下面我来说一下怎么去简单的get请求并获得解析后的数据
寻找api地址
首先你的找一个你想获取的api
我这里直接就拿gank.io来作为例子了 (gank.io介绍)
先就简单的解析一下福利模块(漂亮妹子)
这是api地址
http://gank.io/api/data/福利/10/1
地址的构成如下表
分析JSON格式
第一步我们需要去分析一下JSON的结构,为之后JSON解析的Bean类确定对应的属性
这是api的结构截图。大家稍微注意一下一般的浏览器显示的JSON数据是很杂乱,如下图
建议大家使用Google浏览器然后安装JSONView插件然后浏览器会自动将格式排列整齐,便于程序员清晰的分析其结构,如下图
这样一对比优劣就出来了。继续分析gank.io的JSON格式,它的返回是一个error的布尔值和一个results的结果数组,或叫做Java中的List集合这样就清晰了,那么对应得bean类拥有两个属性一个为String还有一个为叫做Result的对象集合,Result对应的属性类型又对应下表
这样一分析,其Result对应的所有属性也出来了,那么bean类即编写完毕。(每个api对应的结构都是有所不同的,所以,具体api需要具体分析)
对应的bean类代码如下
public class WelfareResult { boolean error; List<Result> results; public boolean isError() { return error; } public void setError(boolean error) { this.error = error; } public List<Result> getResults() { return results; } public void setResults(List<Result> results) { this.results = results; } class Result{ String _id; String createdAt; String desc; String publishedAt; String source; String type; String url; String used; String who; public String get_id() { return _id; } public void set_id(String _id) { this._id = _id; } public String getCreatedAt() { return createdAt; } public void setCreatedAt(String createdAt) { this.createdAt = createdAt; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public String getPublishedAt() { return publishedAt; } public void setPublishedAt(String publishedAt) { this.publishedAt = publishedAt; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsed() { return used; } public void setUsed(String used) { this.used = used; } public String getWho() { return who; } public void setWho(String who) { this.who = who; } }}
当然对于很多复杂的结构,不想一个个分析的,我们也可以使用另一种偷懒的方法,那就是使用Android Studio的插件,如下图搜索GsonFormat此插件然后下载安装,安装完毕后重启Android Studio然后新建一个类作为解析JSON的bean类然后快捷键alt+insert,然后选中GsonFormat,将JSON代码完整的复制进去,再点确定,IDE将自动生成改JSON格式对应的bean类,十分方便快捷。
一切就绪就开始封装一下Retrofit和RxJava了
先将请求数据的接口写出来
public interface ApiStores { static String welfareBaseUrl="http://gank.io/api/data/福利/"; @GET("{count}/{page}") Observable<WelfareResult> loadWelfareData(@Path("count") int count,@Path("page") int page);}
其中welfareBaseUrl指的是请求基地址,由于请求的图片的数量和起始页需要改变所以在使用GET标注时需要把count和page用大括号括起来,用意就是告诉Retrofit这个变量是需要被下面的方法传入的,然后Retrofit就拿这个传入的变量合成对应的请求地址,下面的@Path就是指count变量的值对应请求地址中count的值,同理page也是如此,由于两个都是数字,所以使用int,因为使用的是RxJava的观察者模式所以返回的对象是 Observable< WelfareResult >。
Retrofit的封装
然后设置一下Retrofit对象的一个设置属性,将基地址传入并添加了JSON格式的适配、然后设置该对象使用RxJava请求方式,http连接使用okHttp,然后通过build给welfareRetrofit 初始化
public static Retrofit welfareRetrofit(String baseUrl) { if (welfareRetrofit==null){ OkHttpClient.Builder builder = new OkHttpClient.Builder(); if (BuildConfig.DEBUG) { // Log信息拦截器 HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //设置 Debug Log 模式 builder.addInterceptor(loggingInterceptor); } OkHttpClient okHttpClient = builder.build(); welfareRetrofit = new Retrofit.Builder() .baseUrl(baseUrl), .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(okHttpClient) .build(); } return welfareRetrofit; }
RxJava的封装
对于RxJava的简单使用我就不详细讲了,这里就是讲RxJava的三个方法再封装一下,主要是将onError()中一些常见错误过滤一下
public abstract class ApiCallback<M> extends Subscriber<M> { public abstract void onSuccess(M model); public abstract void onFailure(String msg); public abstract void onFinish(); @Override public void onError(Throwable e) { e.printStackTrace(); if (e instanceof HttpException) { HttpException httpException = (HttpException) e; //httpException.response().errorBody().string() int code = httpException.code(); String msg = httpException.getMessage(); if (code == 504) { msg = "网络不给力"; } if (code == 502 || code == 404) { msg = "服务器异常,请稍后再试"; } onFailure(msg); } else { onFailure(e.getMessage()); } onFinish(); } @Override public void onNext(M model) { onSuccess(model); } @Override public void onCompleted() { onFinish(); }}
请求数据
再封装完Retrofit和RxJava后就直接开始请求数据了,先初始化接口然后传入该方法作为被观察者,再传入ApiCallback作为订阅者(观察者),一旦数据接口获取到数据就会回调观察者的方法。及回调onSuccess(查询到一个数据对应onNext)、onFailure(出错时)、onFinish(查询完成)
ApiStores mApiStores=AppClient.welfareRetrofit(ApiStores.welfareBaseUrl).create(ApiStores.class); addSubscription(mApiStores.loadWelfareData(10, 1), new ApiCallback<WelfareResult>() { @Override public void onSuccess(WelfareResult model) { if (!model.isError()&&model.getResults().size()==10){ mWelfareAdapter.addData(model.getResults()); } } @Override public void onFailure(String msg) { rv_welfare.setRefreshing(false); } @Override public void onFinish() { rv_welfare.setPullLoadMoreCompleted(); } });
RxJava的订阅时间的绑定,设置请求数据在IO线程中完成,观察者活动在主线程中。及避免了异步问题又不需要自己开线程影响代码整洁性。
public void addSubscription(rx.Observable observable, Subscriber subscriber) { if (mCompositeSubscription == null) { mCompositeSubscription = new CompositeSubscription(); } mCompositeSubscription.add(observable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber)); }
将请求到的数据显示
数据请求完毕,则可以使用自己的一些方式去加载,比如用RecycleView的瀑布流显示这个福利图片,有想了解怎么写一个完整demo可以看我的博客(这儿)
- Android Retrofit2.0+RxJava简单示例
- Android Okhttp+Retrofit2.0+RxJava简单解析
- retrofit2+RxJava简单使用
- Android RxJava+Retrofit2.0+MVP模式整合
- Android-网络框架04Retrofit2.0+RxJava
- Android RxJava+Retrofit2.0+MVP的小试牛刀
- 小白装逼:Android retrofit2+rxjava
- 仿googleMVP设计模式示例demo,结合rxjava,retrofit2.0
- Android基于Retrofit2.0+RxJava的结合使用,让你的网络请求更简单
- retrofit2、RxJava简单使用总结
- Retrofit2.0以及rxjava
- retrofit2.0+okhttp3+rxjava的封装(简单好用)
- Android中RxJava+Retrofit2.0+MVP模式的整合
- Android中okHttp+retrofit2.0+RxJava的使用
- Android——MVP+Retrofit2.0+RxJava框架整合
- Android中RxJava+Retrofit2.0+MVP模式的整合
- Android中RxJava+Retrofit2.0+MVP模式的整合
- Android Retrofit2.0-post&get请求&文件上传&结合Rxjava
- Struts2中Action-代码抽取
- 解决windows10下面无法抓取charles数据包问题
- android 自学初级第一天 环境搭建与hello word
- jvm stack 个数
- 两个Activity之间重复相互跳转时遇到的坑
- Android Retrofit2.0+RxJava简单示例
- cent os网络配置详解
- 协方差矩阵和散布矩阵(散度矩阵)的意义
- mysql多表左连接查询例子参考
- "Error: openvasmd: undefined symbol: sqlite3_errstr"问题解决
- 【Shell】将txt中内容乱序
- Android Service学习之IntentService 深入分析
- 动态加载配置文件类,通用类
- nginx+redis+3*tomcat7集群 项目部署(项目发布)