我有这样的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
,解析object
数组中的每个data
并将其添加到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
的力量的正确方法是什么?
答案 0 :(得分:4)
您正确使用它,RxJava具有非常强大的功能,您可以利用它来提高性能。
在哪里使用? 1.在用户事件上,例如按钮单击,按键事件 2.响应延迟限制IO。磁盘/网络读/写 3.由硬件/传感器触发的事件
不应从Observable create手动启动Thread。
使用RxJava改进网络调用: 使用单一:由于我们的API不会分段或多次提供数据。相反,它只会在一次通话中发出一切。 因此,如果onNext()发生,则Observable onCompleted()将紧随其后。 因此,最好使用Single进行API调用。
使用可完成:每当我们需要通过API更新数据到服务器时,我们不会打扰应该是什么结果。我们只是意味着服务是否成功。在这种情况下,我们不期望发射任何东西。因此,鼓励使用Completable。
进度视图隐藏/显示 使用doOnSubscribe()和doFinally()绑定这两个事件。 这是两个运算符,因此我们可以使用RxCall逻辑绑定它们。
RxJava错误处理:
onErrorResumeNext() - 指示Observable在遇到错误时发出一系列项目(这是另一个可观察的项目)
onErrorReturn() - 指示Observable在遇到错误时发出特定项目
onExceptionResumeNext() - 指示Observable在遇到异常后继续发出项目(但不是其他类型的throwable)
重试() - 如果源Observable发出错误,请重新订阅它,希望它能完成而不会出错。 在这里,我们也可以传递参数,重试应该发生多少次。 喜欢。重试(4)。它将重试四次,之后如果再次发生错误则会抛出错误。
retryWhen() - 如果源Observable发出错误,请将该错误传递给另一个Observable以确定是否重新订阅源
RxAndroid for View Binding:
Think Reactive: 我们可以将RxJava用于所有视图事件,包括单击事件,滚动事件,拖动事件。 简而言之,我们可以用RxJava observable替换每个Listener。
可在View级别使用的库: RxBinding,RxSupport-v4,RxAppCompat-v7,RxRecyclerView,RxDesign,RxLeanBack。
与MVP的RxBinding: 我们将从View返回Observable。 这个observable将获取Presenter,并将在Presenter上进行订阅。
RxAdapter:我们可以将它用于Adapter中的数据更改事件。通常适用于Android Listview。 RxRecyclerView:对于recyclerview适配器数据更改事件,我们可以使用它。