Articles of rx java

当使用Retrofit 2.0 Observables时出现错误,如何获取Response body

我正在使用Retrofit 2.0来进行返回Observables的api调用。 当呼叫完成并且响应符合预期时,一切正常。 现在假设我们有一个错误响应,它会抛出一个onError。 我想阅读响应正文,即使它是一个错误。 例 @FormUrlEncoded @POST(“tokenLogin”) Observable loginWithToken( @Field(“token”) String pin ); 当请求和响应有效时,我得到正确的observable,并在出现错误时按预期调用onError。 正确回应: { “status” : “authenticated” } Observable将其转换为正确的Observable,我可以将响应读作LoginResponse对象。 现在,错误响应如下: { “errorMessage” : “You need to take some xyz action” } 我想阅读该错误响应并将消息显示给用户。 我该怎么做呢?

具有多个订户的单个可观察者

我有一个Observable<<List> getFoo() ,它是从Retrofit Service创建的,在调用.getFoo()方法之后,我需要与Multiple Subscribers共享它。 但是,调用.share()方法会导致重新执行网络调用。 重播运算符也不起作用。 我知道可能的解决方案可能是.cache() ,但我不知道为什么会导致这种行为。 // Create an instance of our GitHub API interface. Retrofit retrofit = new Retrofit.Builder() .baseUrl(API_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); // Create a call instance for looking up Retrofit contributors. Observable<List> testObservable = retrofit .create(GitHub.class) .contributors(“square”, “retrofit”) .share(); Subscription subscription1 = testObservable .subscribe(new Subscriber<List>() { @Override public void […]

Android RxJava 2 JUnit测试 – android.os.Looper中的getMainLooper没有模拟RuntimeException

我在尝试为使用observeOn(AndroidSchedulers.mainThread())的演示者运行JUnit测试时遇到RuntimeException。 由于它们是纯JUnit测试而不是Android检测测试,因此它们无法访问Android依赖项,导致我在执行测试时遇到以下错误: java.lang.ExceptionInInitializerError at io.reactivex.android.schedulers.AndroidSchedulers$1.call(AndroidSchedulers.java:35) at io.reactivex.android.schedulers.AndroidSchedulers$1.call(AndroidSchedulers.java:33) at io.reactivex.android.plugins.RxAndroidPlugins.callRequireNonNull(RxAndroidPlugins.java:70) at io.reactivex.android.plugins.RxAndroidPlugins.initMainThreadScheduler(RxAndroidPlugins.java:40) at io.reactivex.android.schedulers.AndroidSchedulers.(AndroidSchedulers.java:32) … Caused by: java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details. at android.os.Looper.getMainLooper(Looper.java) at io.reactivex.android.schedulers.AndroidSchedulers$MainHolder.(AndroidSchedulers.java:29) … java.lang.NoClassDefFoundError: Could not initialize class io.reactivex.android.schedulers.AndroidSchedulers at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) …

何时取消订阅订阅

我有一个关于如何取消订阅可观察量的问题。 我有两个代码,我不确定哪一个更好。 示例1 – >流完成后取消订阅订阅者: Subscriber subscriber = new Subscriber() { @Override public void onCompleted() { progressdialog.dissmiss(); unsubscribe(); } @Override public void onError(Throwable e) { progressdialog.dissmiss(); } @Override public void onNext(String s) { // do something with data } } 示例2 – >销毁活动后取消订阅订阅: private void test(){ Subscriber subscriber = new Subscriber() { @Override public void […]

使用RxJava处理分页

我在Android应用程序上使用Retrofit + RxJava,并且问自己如何处理链接调用的API分页,直到检索到所有数据。 是这样的: Observable getResults(@Query(“page”) int page); ApiResponse对象具有简单的结构: class ApiResponse { int current; Integer next; List results; } API将返回下一个值,直到最后一页为止。 有一些很好的方法来实现这一目标吗? 试图结合一些flatMaps() ,但没有成功。

Kotlin:什么是“返回@”是什么意思?

我在我的一个项目中使用RxJava,我使用Android Studio插件将我的一个类转换为Kotlin,并在map flatMap lambda(java中的Func1)之一中,返回的中间体看起来像下面的@Func1 。 我不知道这是什么意思。 something.flatMap(Func1<ArticleCriteria, Observable<Pair>> { val isTemporaryClone = it.isATemporaryClone val isTheOriginalToken = it.tokenIsOriginalHere if (isTemporaryClone) { if (!isTheOriginalToken) { return@Func1 paramsError(“Token is always original for temp articles”) } return@Func1 mJobRunner.doNotRun(DeleteArticleJob.TAG) .doOnNext(deletePersonalActionById(articleId)) } runArticleJobAsync(DeleteArticleJob.TAG, it) })

链式两个改装可观察物与RxJava

我想一个接一个地执行2个网络呼叫。 两个网络调用都返回Observable。 第二次呼叫使用来自第一次呼叫的成功结果的数据,第二次呼叫的成功结果中的方法使用来自第一次和第二次呼叫的成功结果的数据。 此外,我应该能够以不同的方式处理onError“事件”。 我怎样才能避免回调地狱,如下例所示: API().auth(email, password) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1() { @Override public void call(final AuthResponse authResponse) { API().getUser(authResponse.getAccessToken()) .subscribe(new Action1<List>() { @Override public void call(List users) { doSomething(authResponse, users); } }, new Action1() { @Override public void call(Throwable throwable) { onErrorGetUser(); } }); } }, new Action1() { @Override public void call(Throwable throwable) […]

RxJava:找出BehaviorSubject是否是重复的值

我正在制作一个Android界面,显示从networking中获取的一些数据。 我想让它显示最新的可用数据,并永远不会是空的(除非根本没有数据被提取),所以我使用BehaviorSubject为订户(我的用户界面)提供最新的可用信息,同时刷新它更新它的背景。 这是有效的,但由于我的用户界面的另一个要求,我现在必须知道发布的结果是否从networking获得新鲜或不。 (换句话说,我需要知道发布的结果是否为BehaviorSubject的保存项目。) 我怎样才能做到这一点? 如果我需要将它分解为多个Observables,那就好,只要我能够获得BehaviorSubject的caching行为(获取最后的可用结果),同时也能够判断返回的结果是来自caching还是不。 我认为这样做的一个拙劣的方法是检查响应的时间戳是否相对较快,但是这实在是太渺茫了,我宁愿想办法用RxJava来完成。

互联网检查,使用MVP,RX和Retrofit的地方

我已经通过这个和这个职位。 所以我真的同意第二个post,主持人不应该知道android的具体事情。 所以我在考虑的是把互联网检查放在服务层。 我正在使用Rx Java进行networking调用,所以我可以在进行服务调用之前进行networking检查,所以这样我需要手动抛出和IOException,因为当networking不可用时需要在视图上显示错误页面,另一个select是我创build我自己的错误类没有互联网 Observable<PaginationResponse<Notification>> response = Observable.create(new Observable.OnSubscribe<PaginationResponse<Notification>>() { @Override public void call(Subscriber<? super PaginationResponse<Notification>> subscriber) { if (isNetworkConnected()) { Call<List<Notification>> call = mService.getNotifications(); try { Response<List<Notification>> response = call.execute(); processPaginationResponse(subscriber, response); } catch (IOException e) { e.printStackTrace(); subscriber.onError(e); } } else { //This is I am adding manually subscriber.onError(new IOException); } subscriber.onCompleted(); […]

RxJava和Android上的随机零星事件

我想要像使用番石榴的EventBus或Otto一样使用RxJava ,但是我不知道如何才能使用这种方式。 这是场景:假设我想在我的Android应用程序中有一个button,并且每次按下button我都希望RxJava通过我的Observable发出一个事件。 在我看来,必须在事件发生后reregister服务,并且该活动还需要创build新的可观察事件。 就像我说的 Observable.from(x) 在我看来,对于每个事件我都需要这样做,但是这会创build一个需要重新注册的新的可观察对象。 当然,我失去了一些东西。