RxJava + Retrofit 2 的正确使用方法
Right way of using RxJava + Retrofit 2
我有这样的 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"
},
...
]
}
根据它必须 Classes
(pojo) 使用模式创建到 pojo。第一个提供从 data
数组获取数据的方法 ->
public List<Datum> getData() {
return data;
}
第二个是这个数据的model
。
虽然我只使用改造 2.0,但我执行了 call
,解析 data
数组中的每个 object
并将其添加到 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);
}
所以这对我来说是一种常见的方式。现在我想使用 RxJava
.
做同样的事情
这是我的 interface
:
public interface Places {
@GET("places.getPlaces")
Observable<PlaceList> list(@Query("type") int type,
@Query("offset") int offset,
@Query("limit") int limit);
}
这就是我的表现 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());
}
});
是的,它也有效,但它是使用 Rx
的正确方法吗?我试图比较解析所需的时间,但没有发现任何显着差异。
在阅读了几篇文章之后,我才刚刚开始学习 RxJava。那么如何正确感受RxJava
的力量呢?
您使用得当,RxJava 具有强大的功能,您可以利用它来提高性能。
在哪里使用?
1. 用户事件,比如按钮点击,按键事件
2.响应延迟绑定IO。 Disk/network read/write
3. Hardware/sensors
触发的事件
不应从 Observable 创建中手动启动线程。
使用 RxJava 改造网络调用:
使用单次:因为我们的API不会一次或多次给出数据。相反,它会在一次调用中发出所有内容。
因此,在 Observable 的情况下,一旦 onNext() 发生,onCompleted() 就会随之而来。
所以,API调用最好用Single。
Use Completable : 每当我们只需要通过API更新数据到Server时,我们不关心结果应该是什么。我们只是指服务是否成功。在这种情况下,我们不期望发出任何东西。因此,在案例中鼓励使用 Completable。
进度查看hide/show:
用 doOnSubscribe() 和 doFinally() 绑定这两个事件。
这是两个运算符,因此我们可以在逻辑上将它们与 RxCall 绑定。
RxJava 错误处理:
onErrorResumeNext() — 指示 Observable 在遇到错误时发出一系列项目(这是另一个 observable)
onErrorReturn() — 指示 Observable 在遇到错误时发出特定项目
onExceptionResumeNext() — 指示 Observable 在遇到异常后继续发射项目(但不是另一种类型的 throwable)
retry() — 如果源 Observable 发出错误,重新订阅它,希望它能无错误地完成。
在这里我们还可以传递应该重试多少次的参数。
像。重试(4)。它将重试四次,之后如果再次发生错误,则会抛出错误。
retryWhen() — 如果一个源 Observable 发出错误,将该错误传递给另一个 Observable 以确定是否重新订阅该源
RxAndroid 用于视图绑定:
思考反应:
我们可以将 RxJava 用于所有视图事件,包括点击事件、滚动事件、拖动事件。
简而言之,我们可以用 RxJava observables 替换每个 Listener。
可在视图级别使用的库:
RxBinding、RxSupport-v4、RxAppCompat-v7、RxRecyclerView、RxDesign、RxLeanBack。
RxBinding 与 MVP:
我们将从 View return Observable。
这个 observable 将获取到 Presenter 并将在 Presenter 上进行订阅。
RxAdapter: 我们可以将其用于 Adapter 中的数据更改事件。通常可用于 Android 列表视图。
RxRecyclerView:对于recyclerview适配器数据变化事件,我们可以使用这个。
我有这样的 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"
},
...
]
}
根据它必须 Classes
(pojo) 使用模式创建到 pojo。第一个提供从 data
数组获取数据的方法 ->
public List<Datum> getData() {
return data;
}
第二个是这个数据的model
。
虽然我只使用改造 2.0,但我执行了 call
,解析 data
数组中的每个 object
并将其添加到 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);
}
所以这对我来说是一种常见的方式。现在我想使用 RxJava
.
这是我的 interface
:
public interface Places {
@GET("places.getPlaces")
Observable<PlaceList> list(@Query("type") int type,
@Query("offset") int offset,
@Query("limit") int limit);
}
这就是我的表现 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());
}
});
是的,它也有效,但它是使用 Rx
的正确方法吗?我试图比较解析所需的时间,但没有发现任何显着差异。
在阅读了几篇文章之后,我才刚刚开始学习 RxJava。那么如何正确感受RxJava
的力量呢?
您使用得当,RxJava 具有强大的功能,您可以利用它来提高性能。
在哪里使用? 1. 用户事件,比如按钮点击,按键事件 2.响应延迟绑定IO。 Disk/network read/write 3. Hardware/sensors
触发的事件不应从 Observable 创建中手动启动线程。
使用 RxJava 改造网络调用: 使用单次:因为我们的API不会一次或多次给出数据。相反,它会在一次调用中发出所有内容。 因此,在 Observable 的情况下,一旦 onNext() 发生,onCompleted() 就会随之而来。 所以,API调用最好用Single。
Use Completable : 每当我们只需要通过API更新数据到Server时,我们不关心结果应该是什么。我们只是指服务是否成功。在这种情况下,我们不期望发出任何东西。因此,在案例中鼓励使用 Completable。
进度查看hide/show: 用 doOnSubscribe() 和 doFinally() 绑定这两个事件。 这是两个运算符,因此我们可以在逻辑上将它们与 RxCall 绑定。
RxJava 错误处理:
onErrorResumeNext() — 指示 Observable 在遇到错误时发出一系列项目(这是另一个 observable)
onErrorReturn() — 指示 Observable 在遇到错误时发出特定项目
onExceptionResumeNext() — 指示 Observable 在遇到异常后继续发射项目(但不是另一种类型的 throwable)
retry() — 如果源 Observable 发出错误,重新订阅它,希望它能无错误地完成。 在这里我们还可以传递应该重试多少次的参数。 像。重试(4)。它将重试四次,之后如果再次发生错误,则会抛出错误。
retryWhen() — 如果一个源 Observable 发出错误,将该错误传递给另一个 Observable 以确定是否重新订阅该源
RxAndroid 用于视图绑定:
思考反应: 我们可以将 RxJava 用于所有视图事件,包括点击事件、滚动事件、拖动事件。 简而言之,我们可以用 RxJava observables 替换每个 Listener。
可在视图级别使用的库: RxBinding、RxSupport-v4、RxAppCompat-v7、RxRecyclerView、RxDesign、RxLeanBack。
RxBinding 与 MVP: 我们将从 View return Observable。 这个 observable 将获取到 Presenter 并将在 Presenter 上进行订阅。
RxAdapter: 我们可以将其用于 Adapter 中的数据更改事件。通常可用于 Android 列表视图。 RxRecyclerView:对于recyclerview适配器数据变化事件,我们可以使用这个。