Android RxJava2应用程序在从创建的observable调用emitter.onError()时崩溃

时间:2017-09-25 13:34:22

标签: android rx-java2

我在Observable的帮助下手动创建create()。现在在里面,我检查一些条件&基于此,我想通知订户有关错误。以下是我创建可观察的方式:

public Observable<User> loginUser(String email, String password) {
    return Observable.create(
        emitter -> {
            myAsynchronousWork.onCompleteListener(
               result -> {
                   if(!result.isSuccess()) {
                      // This causes the crash.
                      emitter.onError(new Throwable(result.getError()));
                   } else {
                      // Process result & create User object & return it. This works as expected.
                      emitter.onNext(user);
                      emitter.onComplete();
                   }
               }
            );

        }
    );

}

&安培;然后我订阅了loginUser(),如:

loginUser("", "")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(user -> {
                    Log.d("TAG", "logged in user => " + user.getUuid());
                    Log.d("TAG", "user name => " + user.getUserName());
                    Log.d("TAG", "user email => " + user.getEmailId());
                }, throwable -> {
                    Log.e("TAG", "error in login => " + throwable.getMessage());
                }, () -> {

                });

我希望调用emitter.onError()应该放在subscribe()的{​​{1}}的错误中,我已经记录了异常,但是应用程序因{{1}返回的异常而崩溃了在logcat中,没有人可以处理它!

我通过调试&amp;检查了发现虽然它位于loginUser()上,emitter.onError()却是emitter.onError()。然而onNext&amp; onComplete不会导致任何问题。 请告诉我我在哪里做错了?

3 个答案:

答案 0 :(得分:3)

我的应用程序崩溃的原因是,我实际上是这样的:

myAsynchronousWork.onCompleteListener(
               result -> {
                   if(!result.isSuccess()) {
                      // This causes the crash.
                      emitter.onError(new Throwable(result.getError()));
                   } else {
                      // Process result & create User object & return it. This works as expected.
                      emitter.onNext(user);
                      emitter.onComplete();
                   }
               },
               exception -> {
                   emitter.onError(exception); // This was the reason of problem!
               }
            );

我没有发布完整的部分,因为我没有得到它导致异常。

这里发生的事情是,我的代码首先进入了exception->部分内部,该部分正在向观察者通知错误&amp;那个观察者被终止了。现在我的result->部分被执行了在我尝试再次拨打emitter.onError()时,由于没有emitter来处理此问题,因此崩溃了RxJava2在全球范围内抛出它。

所以对我来说,我删除了exception ->部分,就像result ->那样我可以查看结果&amp;我还用

包装了emitter.onError
if(!emitter.isDisposed()) emitter.onError();

因为在我的情况下,如果处理了发射器,可以忽略错误。

答案 1 :(得分:0)

当您创建observable时,您必须自己处理所有可能的错误。所以你的代码应该如下所示:

public Observable<User> loginUser(String email, String password) {
    return Observable.create(
        emitter -> {
          try{
            myAsynchronousWork.onCompleteListener(
               result -> {
                 try{
                   if(!result.isSuccess()) {
                      // This causes the crash.
                      emitter.onError(new Throwable(result.getError()));
                   } else {
                      // Process result & create User object & return it. This works as expected.
                      emitter.onNext(user);
                      emitter.onComplete();
                   }
                 }catch(Exception e){
                    emitter.onError(e);
                 }
               }
            );
         }catch(Exception e){
            emitter.onError(e);
        }

        }
    );

}

PS:在创建可观察和一次性时,始终确保错误检查。

答案 2 :(得分:0)

使用 emitter.tryOnError 对我有用,它也会在 subscribe() 内调用错误,而无需 UndeliverableException 或应用停止运行。