CR-VxJava2 实战体系小说

大切诺基xJava2 实战知识梳理(1) – 后台执行耗费时间操作,实时通报 UI
更新

奔驰M级xJava2 实战知识梳理(2) –
总括一段时间内数据的平均值

XC60xJava2 实战知识梳理(3) –
优化搜索联想效率

EnclavexJava2 实战知识梳理(4) – 结合 Retrofit
请求新闻资源音讯

RubiconxJava2 实战知识梳理(5) –
不难及进阶的轮询操作

OdysseyxJava2 实战知识梳理(6) –
基于错误类型的重试请求

OdysseyxJava2 实战知识梳理(7) – 基于 combineLatest
完结的输入表单验证

LacrossexJava2 实战知识梳理(8) – 使用 publish + merge
优化先加载缓存,再读取网络数据的请求进度

TucsonxJava2 实战知识梳理(9) – 使用 timer/interval/delay
实现职务调度

HavalxJava2 实战知识梳理(10) – 荧屏旋转导致 Activity
重建时上涨任务

奥迪Q3xJava2 实战知识梳理(11) –
检查和测试互连网状态并自行重试请求

奥德赛xJava2 实战知识梳理(12) – 实战讲解 publish & replay & share & refCount
& autoConnect

哈弗xJava2 实战知识梳理(13) –
怎么着使得错误爆发时不自动甘休订阅关系

陆风X8xJava2 实战知识梳理(14) – 在 token 过期时,刷新过期 token
比量齐观新发起呼吁

LANDxJava2 实战知识梳理(15) – 实现一个简单的 MVP + 昂CoraxJava + Retrofit
应用


一、前言

怎么样通过结合Retrofit框架来拓展互连网请求,也是RxJava的上学进程中务须要控制的一环。网上早就有许多开源项目和文章介绍了,前些天那篇文章,我们就通过三个简单的事例,通过RxJava + Retrofit的措施贯彻网络请求。

其一例子相当粗略,大家经过
干货集中营
提供的接口,分别请求Android类和iOS类的音信,并将那五个接口所再次来到的多少在界面上开始展览显示。

透过该例子,可以学学如何将RetrofitRxJava结合,并通过zip操作符完结等待八个互联网请求完结。

二、示例

2.1 接口介绍

率先来熟知一下所用到的测试接口,其数额来自于
干货集中营,那里选拔AndroidiOS两类的情报,通过接口的叙述,能够知晓发起呼吁时的变量包涵多个:

  • 分类
  • 呼吁个数
  • 请求页数

新濠娱乐 1

回去的多少格式如下:

新濠娱乐 2

2.2 编写 Entity 类

据说分析好的数量格式,大家编辑对应的Entity类:

  • 单次重临结果的数据结构:

public class NewsEntity {

    private boolean error;
    private List<NewsResultEntity> results = new ArrayList<>();

    public boolean isError() {
        return error;
    }

    public void setError(boolean error) {
        this.error = error;
    }

    public List<NewsResultEntity> getResults() {
        return results;
    }

    public void setResults(List<NewsResultEntity> results) {
        this.results = results;
    }
}
  • 单条资讯的数据结构:

public class NewsResultEntity {

    private String type;
    private String publishedAt;
    private String desc;
    private String who;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getPublishedAt() {
        return publishedAt;
    }

    public void setPublishedAt(String publishedAt) {
        this.publishedAt = publishedAt;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getWho() {
        return who;
    }

    public void setWho(String who) {
        this.who = who;
    }
}

2.3 引入 Retrofit 依赖

接下来,在build.gradle文件中,引入必要的信赖,以下五个依靠包的功用分别为:

  • Retrofit的大旨库
  • 将赶回的Call<Response>转换成Call<NewsEntity>
  • Call<NewsEntity>转换成Observable<NewsEntity>

dependencies {
     //省略....
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0'
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

}

说到底别忘了,在AndroidManifest.xml中表明须要的网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

2.4 定义 Retrofit 需求的乞求接口

按照Retrofit的行使介绍,大家要求定义八个接口类,那一个接口类的再次回到值为Observable<NewsEntity>,也等于我们事先定义好的数据结构。而这几个接口接收四个参数:请求类型、请求个数、请求所在页数。

public interface NewsApi {

    @GET("api/data/{category}/{count}/{page}")
    Observable<NewsEntity> getNews(@Path("category") String category, @Path("count") int count, @Path("page") int page);
}

当大家要求请求数据时,就应有像上面那样构造多少个Observable<NewsEntity>

  • baseUrl:定义请求链接的前缀
  • addConverterFactory:将OKHttp归来的规范Response分析成大家所要求的数据类型NewsEntity
  • addCallAdapterFactory:将Call<NewsEntity>转换成Observable<NewsEntity>,那样才能真的将RetrofitRxJava组合起来。

    private Observable<NewsEntity> getObservable(String category, int page) {
        NewsApi api = new Retrofit.Builder()
                .baseUrl("http://gank.io")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build().create(NewsApi.class);
        return api.getNews(category, 10, page);
    }

2.5 发起呼吁

上述正是负有的备选干活,回看一下我们首要做了以下四步,那也是从此我们应用任何任意接口时的科班流程:

  • 熟练接口
  • 听说接口再次来到的数据,定义Entity
  • 根据接口的url构成格局定义Retrofit所急需的接口注脚,接口函数的回到类型为Observable<Entity>,其中Entity正是第2步中定义好的回到数据类型。
  • 通过Retrofit,遵照第3步的接口定义,再次回到真正的Observable

实则通过上述的四步,大家的行事就差不多做到了,只须要把上边第④步中回到的Observable<XXXEntity>用作一个发送数据的日常数据源就能够了。

以身作则代码如下,大家呼吁了AndroidiOS五个接口,并且动用zip操作符让七个接口都回去之后,才将数据表现给用户,同时每便点击刷新资源音讯之后,大家将页数扩展一以请求新的消息。

public class NewsActivity extends AppCompatActivity {

    private int mCurrentPage = 1;
    private NewsAdapter mNewsAdapter;
    private List<NewsResultEntity> mNewsResultEntities = new ArrayList<>();
    private CompositeDisposable mCompositeDisposable = new CompositeDisposable();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news);
        initView();
    }

    private void initView() {
        Button btRefresh = (Button) findViewById(R.id.bt_refresh);
        btRefresh.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                refreshArticle(++mCurrentPage);
            }
        });
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv_news);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        mNewsAdapter = new NewsAdapter(mNewsResultEntities);
        recyclerView.setAdapter(mNewsAdapter);
        refreshArticle(++mCurrentPage);
    }

    private void refreshArticle(int page) {
       Observable<List<NewsResultEntity>> observable = Observable.just(page).subscribeOn(Schedulers.io()).flatMap(new Function<Integer, ObservableSource<List<NewsResultEntity>>>() {

            @Override
            public ObservableSource<List<NewsResultEntity>> apply(Integer page) throws Exception {
                Observable<NewsEntity> androidNews = getObservable("Android", page);
                Observable<NewsEntity> iosNews = getObservable("iOS", page);
                return Observable.zip(androidNews, iosNews, new BiFunction<NewsEntity, NewsEntity, List<NewsResultEntity>>() {

                    @Override
                    public List<NewsResultEntity> apply(NewsEntity androidEntity, NewsEntity iosEntity) throws Exception {
                        List<NewsResultEntity> result = new ArrayList<>();
                        result.addAll(androidEntity.getResults());
                        result.addAll(iosEntity.getResults());
                        return result;
                    }
                });
            }
        });
        DisposableObserver<List<NewsResultEntity>> disposable = new DisposableObserver<List<NewsResultEntity>>() {

            @Override
            public void onNext(List<NewsResultEntity> value) {
                mNewsResultEntities.clear();
                mNewsResultEntities.addAll(value);
                mNewsAdapter.notifyDataSetChanged();
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };
        observable.observeOn(AndroidSchedulers.mainThread()).subscribe(disposable);
        mCompositeDisposable.add(disposable);
    }

    private Observable<NewsEntity> getObservable(String category, int page) {
        NewsApi api = new Retrofit.Builder()
                .baseUrl("http://gank.io")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build().create(NewsApi.class);
        return api.getNews(category, 10, page);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCompositeDisposable.clear();
    }
}

运作结果为:

新濠娱乐 3

三 、示例解析

至于怎么样运用Retrofit + RxJava前边早已说得相比清楚了,下边大家主要介绍一下新接触的五个操作符,flatMapzip

3.1 flatMap

flatMap的原理图如下所示:

新濠娱乐 4

它接受3个Function函数,对于上游发送的各样事件它都会接纳该函数,那么些函数重返两个新的Observable,假如有几个Observable,那么她会发送合并后的结果。

在地方的例证中,上游的just发送叁个伸手的所在页数,大家遵照那些页数再去创制三个新的Observable来发送数据。

3.2 zip

zip操作符的规律图如下所示:

新濠娱乐 5

它接受七个Observable,以及3个函数,该函数的形参为那一个Observable新濠娱乐,发送的数据,并且要等具备的Observable都发出完会后才会回调该函数。

通过zip操作符,大家就足以兑现等待多少个网络请求完结再回去的供给,例如在上头的例子中,大家会等待AndroidiOS类的音讯请求都回到之后,再统一它们的结果发送给下游,在界面上出示。


越来越多小说,欢迎访问作者的 Android 知识梳理类别:

网站地图xml地图