RxJava + Retrofit 2 的正确使用方法

Igo*_*ryl 4 java json rx-java retrofit2

我有这样的 JSON:

{  
"success":true,
"data":[  
   {  
      "id":"29",
     "name":"\u0420\u0435\u0441\u0442\u043e\u0440\u0430\u0446\u0456\u044f \u0411\u0430\u0447\u0435\u0432\u0441\u044c\u043a\u0438\u0445 \/ Baczewski Restaurant",
     "street":"\u0432\u0443\u043b.    \u0428\u0435\u0432\u0441\u044c\u043a\u0430, 8",
     "latitude":"49.842292845502",
     "longitude":"24.029848249565",
     "image":"https:\/\/i.onthe.io\/j9aocq72r2lfsmoh9.r500x500.01ff9fff.jpg"
     },
     ...
    ]
    }
Run Code Online (Sandbox Code Playgroud)

根据它必须 Classes(pojo)用模式创建到pojo。第一个提供了从data数组中获取数据的方法 - >

public List<Datum> getData() {
    return data;
}
Run Code Online (Sandbox Code Playgroud)

第二个是model 这个数据的一个。

在仅使用改造 2.0 时,我执行 a callobjectdata数组中解析每个并将其添加到RecyclerView.Adapter

Call<PlaceList> call = service.list(1, offset, 10);
call.enqueue(new Callback<PlaceList>() {
        @Override
        public void onResponse(Call<PlaceList> call, Response<PlaceList> response) {
            final int size = response.body().getData().size();
            for (int i = 0; i < size; i++) {
                places.add(response.body().getData().get(i));
            }
            handler.post(new Runnable() {
                @Override
                public void run() {
                    if (offset == 0)
                        //   adapter.notifyItemRangeInserted(0, foodDataList.size());
                        placeRecyclerAdapter.notifyDataSetChanged();
                    else
                        placeRecyclerAdapter.notifyItemRangeChanged(places.size() - size, places.size());
                }
            });

        }

        @Override
        public void onFailure(Call<PlaceList> call, Throwable t) {

        }
    });  
    _______________

    public interface Places {
@GET("places.getPlaces")
Call<PlaceList> list(
        @Query("type") int type,
        @Query("offset") int offset,
        @Query("limit") int limit);
       }
Run Code Online (Sandbox Code Playgroud)

所以这对我来说是一种通常的方式。现在我想使用RxJava.

这是我的interface

public interface Places {
@GET("places.getPlaces")
Observable<PlaceList> list(@Query("type") int type,
                             @Query("offset") int offset,
                             @Query("limit") int limit);
}
Run Code Online (Sandbox Code Playgroud)

这就是我的表现call

  Observable<PlaceList> call = service.list(1, offset, 10);
    subscription = call.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<PlaceList>() {
                @Override
                public void onCompleted() {
                    System.out.println("onComplete");
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("onError");
                    e.printStackTrace();
                }

                @Override
                public void onNext(PlaceList data) {
                    placeRecyclerAdapter.addData(data.getData());
                }
            });
Run Code Online (Sandbox Code Playgroud)

是的,它也有效,但这是一种正确的使用方式Rx吗?我试图比较解析所需的时间,但没有发现任何显着差异。在阅读了几篇文章之后,我才刚刚开始学习 RxJava。那么,感受力量的正确方式是RxJava什么?

Mil*_*ada 5

您正确使用它,RxJava 具有非常强大的功能,您可以利用它来提高性能。

在哪里使用? 1. 在用户事件上,如按钮点击、按键事件 2. 响应延迟绑定 IO。磁盘/网络读/写 3. 硬件/传感器触发的事件

不应从 Observable create 手动启动 Thread。

Retrofit Network call with RxJava: Use Single :因为我们的 API 不会分片或多次提供数据。相反,它将在一次调用中发出所有内容。因此,在 Observable 的情况下 onCompleted() 将在 onNext() 发生时立即出现。所以,API调用最好使用Single。

使用 Completable :每当我们需要通过 API 将数据更新到 Server 时,我们不关心结果应该是什么。我们只是说服务是否成功。在这种情况下,我们不期望发出任何东西。所以在这种情况下鼓励使用 Completable。

对于进度视图隐藏/显示: 使用 doOnSubscribe() 和 doFinally() 绑定这两个事件。这是两个运算符,因此我们可以在逻辑上将它们与 RxCall 绑定。

RxJava 错误处理:

onErrorResumeNext(?) —指示 Observable 在遇到错误时发出一系列项目(这是另一个 observable)

onErrorReturn(?) —指示 Observable 在遇到错误时发出特定项目

onExceptionResumeNext(?) —指示 Observable 在遇到异常后继续发射项目(但不是另一种可抛出的)

retry(?) —如果源 Observable 发出错误,请重新订阅它,希望它能无错误地完成。在这里,我们还可以传递重试应该发生多少次的参数。喜欢。重试(4)。它将重试四次,之后如果再次发生错误,则会抛出错误。

retryWhen(?) —如果源 Observable 发出错误,则将该错误传递给另一个 Observable 以确定是否重新订阅源

用于视图绑定的 RxAndroid:

Think Reactive: 我们可以将 RxJava 用于所有视图事件,包括单击事件、滚动事件、拖动事件。简而言之,我们可以用 RxJava observables 替换每个 Listeners。

在视图级别使用的可用库: RxBinding、RxSupport-v4、RxAppCompat-v7、RxRecyclerView、RxDesign、RxLeanBack。

RxBinding 与 MVP: 我们将从 View 返回 Observable。这个 observable 将获取到 Presenter 并将在 Presenter 上进行订阅。

RxAdapter:我们可以将其用于 Adapter 中的数据更改事件。通常可用于 Android Listview。RxRecyclerView:对于 recyclerview 适配器数据更改事件,我们可以使用它。