我需要执行一个请求,如果我的 token 已过期,我需要刷新它并重试请求。

这就是我尝试这样做的方式,目前我可以刷新 token ,但它向我抛出一个 NetworkOnMainThreadException。它完成了请求,更新了 token 并到达了日志,但是这个异常让我很沮丧。我怎样才能避免这种情况?

    public Observable<Estabelecimento> listarEstabelecimentos() {
    return Observable.defer(this::getListarEstabelecimentoObservable)
            .retryWhen(throwableObservable -> throwableObservable.flatMap(
                    throwable -> {
                        if (throwable instanceof UnauthorizedException) {
                            return mRequestManager.getTokenObservable(AutoAtendimentoApplication.getContext())
                                    .doOnNext(response -> /* log stuff */)
                                    .flatMap((Function<AuthResponse, ObservableSource<?>>) response2 ->
                                            getListarEstabelecimentoObservable()
                                                    .doOnNext(estabelecimento ->
                                                            /* log stuff */)
                                                    )
                                    );
                        }
                        return Observable.error(throwable);
                    }));
}

网络错误处理程序:
    public <T> T  processError(Response<T> response ) {
    switch (response.code()) {
        case 401:
            throw new UnauthorizedException();
        default:
            return response.body();
    }
}

代币:
       private Observable<AuthResponse> getToken(Context context,
                                          @GrantType.GrantTypeDef String grantType, @Nullable String refreshToken) {

    SessionManager sessionManager = SessionManager.getInstance(context);
    Usuario usuario = sessionManager.getUser();

    AuthRequest request = new AuthRequest(usuario.getUsername(),
            usuario.getPassword(), grantType, refreshToken);

    return mAuthAPIService.getToken(request)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .map(response -> storeTokens(response, context));
}

编辑 1:我很确定问题发生在 flatmap 内部,而 put subscribeOn 并不能解决问题

编辑 2:代码更新

最佳答案

您的网络在主线程上运行,可以通过将observeOn(AndroidSchedulers.mainThread())subscribeOn(Schedulers.io())添加到可观察对象来解决该问题。
observeOn(...)意味着结果将在指定的线程(在本例中为UI线程)上发出。
subscribeOn(...)调用基本上是处理请求的地方。如果省略,则在当前线程上进行计算。

关于android - RxJava 2/改造 2 - NetworkOnMainThreadException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44007570/

10-10 08:01