【问题标题】:Android RxJava2 App crashing on calling emitter.onError() from created observableAndroid RxJava2 App 在从创建的 observable 调用emitter.onError() 时崩溃
【发布时间】:2021-04-10 17:50:32
【问题描述】:

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

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() 应该进入我记录异常的 loginUser()subscribe() 的 onError 内部,但是应用程序会崩溃,并在 logcat 中出现 emitter.onError() 返回的异常,就像没有人一样处理它!

我通过调试检查并发现它在线时emitter.onError()emitter"null"。但是 onNext & onComplete 不会造成任何问题。 请让我知道我哪里做错了?

【问题讨论】:

  • 为错误提供 StackTrace..

标签: android rx-java2


【解决方案1】:

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

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-&gt; 部分,该部分通知观察者有关错误并且该观察者正在终止。现在我的result-&gt; 部分正在执行,当我尝试再次调用emitter.onError() 时,它崩溃了,因为没有emitter 来处理这个问题,RxJava2 正在全局抛出它。

所以对我来说,我删除了 exception -&gt; 部分,因为它可以在 result -&gt; 上查看结果,并且我还用

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

因为在我的情况下,如果发射器被释放,则忽略该错误是可以的。

【讨论】:

  • 对于遇到此问题的任何其他人,您可以使用emitter.tryOnError(),它将检查已处理状态以防止崩溃。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    当你创建 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:在创建 observable 和 Disposable 时始终确保错误检查。

    【讨论】:

    • 这不能解决问题,因为应用程序在调用 emitter.onError() 时崩溃了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2011-06-24
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多