Android Retrofit2.0+RxJava简单示例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34379015/article/details/72394197

Android Retrofit2.0+RxJava简单示例

  • Retrofit简介
  • RxJava简介
  • Retrofit+RxJava简单示例
  • 如何简单GET一个api数据

目录

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请求并获得解析后的数据

Created with Raphaël 2.1.0 开始 找到需要解析的api地址 分析该api中JSON数据格式 编写JSON格式对应的Java bean类 封装Retrofit并编写加载数据接口 将RxJava+Retrofit结合请求数据 请求完后将数据显示出来 结束

寻找api地址

首先你的找一个你想获取的api
我这里直接就拿gank.io来作为例子了 (gank.io介绍)
先就简单的解析一下福利模块(漂亮妹子)
这是api地址
http://gank.io/api/data/福利/10/1
地址的构成如下表

基地址 http://gank.io/api/data
模块 福利
数量 10
起始数 1

分析JSON格式

第一步我们需要去分析一下JSON的结构,为之后JSON解析的Bean类确定对应的属性

这里写图片描述

这是api的结构截图。大家稍微注意一下一般的浏览器显示的JSON数据是很杂乱,如下图
这里写图片描述

建议大家使用Google浏览器然后安装JSONView插件然后浏览器会自动将格式排列整齐,便于程序员清晰的分析其结构,如下图
这里写图片描述

扫描二维码关注公众号,回复: 3802837 查看本文章

这样一对比优劣就出来了。继续分析gank.io的JSON格式,它的返回是一个error的布尔值和一个results的结果数组,或叫做Java中的List集合这样就清晰了,那么对应得bean类拥有两个属性一个为String还有一个为叫做Result的对象集合,Result对应的属性类型又对应下表

字段 对应数据类型 含义
_id String 福利图片对应的id
createdAt Date 建立该福利图片的时间
desc String 对应建立时间的月和日
publishedAt Date 对应发布的时间
source String 来源
type String 数据对应的类型(这里的类型指的就是福利)
url String 对应福利图片的下载链接
used Boolean 是否被使用过
who String 发布者

这样一分析,其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可以看我的博客(这儿)

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_34379015/article/details/72394197