【发布时间】:2017-10-15 21:30:15
【问题描述】:
我需要执行一个请求,如果我的令牌已过期,我需要刷新它并重试请求。
这就是我正在尝试的方式,目前我可以刷新令牌,但它会抛出 NetworkOnMainThreadException。它完成了请求,更新了令牌并到达了日志,但是那个异常杀死了我。我怎样才能避免这种情况?
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:我很确定问题发生在平面地图内部,并且 subscribeOn 不能解决问题
编辑 2:代码更新
【问题讨论】:
-
我猜这行 mRequestManager.getTokenObservable(AtendimentoApplication.getContext()) .doOnNext(response -> Log.i("NEXT", "OK")).doOnError(throwable1 -> Log .i("ONERROR", "NOT OK"));导致错误?
-
发布你的 mRequestManager.getTokenObservable 实现
-
这一行,estabelecimento.getIdSincronizacao() 发出请求?
-
mLoginViewModel.listEstabelecimentos() 这是请求。你向我展示的那一行解析数据
-
提供更多代码!
标签: android retrofit rx-java retrofit2 rx-java2