Single.just 异常

Single.just exception

我很难理解为什么 RxJava 没有捕获我的异常,它就崩溃了。获取对象发射时出现异常。

我的代码如下所示:

TestService testService = new TestService();
Single.just(testService.testGetUser())
      .subscribeOn(Schedulers.newThread())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribeWith(new DisposableSingleObserver<User>() {
        @Override
        public void onSuccess(@NonNull User user) {
          Log.d(TAG, "onSuccess(): Launching Home Activity");
          Intent intent = new Intent(LoginActivity.this, HomeActivity.class);
          startActivity(intent);
        }

        @Override
        public void onError(@NonNull Throwable e) {
          Log.d(TAG, "onError()");
        }
      });

我的测试服务 class 看起来像:

public class TestService {
public User logInUser(LogInData logInData) throws RuntimeException {
        Log.d(TAG, "logInUser(): Logging user in");
        User user = this.guideMeAroundData.logInUser(logInData);
        return user;
      }
}

在我的 logInUser() 方法中,如果用户无效,我将抛出异常。这会导致我的整个 Android 应用程序崩溃。

看来这不是正确的做法。谁能告诉我应该如何处理在获取要发出的对象时抛出异常的情况?

大多数情况下,未经检查的异常都会被 RxJava 捕获。

但对于已检查的异常,您需要提供自己的 try{}catch(){} 块。

一个例子是 -

String transform(String input) throws IOException;


Observable.just("Hello!")  
  .map(input -> {
    try {
      return transform(input);
    } catch (Throwable t) {
      throw Exceptions.propagate(t);
    }
  })

查看此 post 了解信息,它解释得很好。

http://blog.danlew.net/2015/12/08/error-handling-in-rxjava/

这是对 Java 语法和操作的一种非常普遍(且令人费解)的误解。代码

Single.just(testService.testGetUser())

相当于

User tmp1 = testService.testGetUser();
Single.just(tmp1)

其中 testGetUser 在 RxJava 之前执行,甚至参与其中,因此它抛出的任何异常都会在此之前发生。

您可能正在寻找

Single.fromCallable(() -> testService.testGetUser())

或者简单地将 Retrofit API 定义为 Single<User> logInUser(LogInData data).