【发布时间】:2017-10-17 15:51:34
【问题描述】:
问题
当其中一个 API 调用因缺少授权令牌而失败时,我正在尝试注销我的用户。但我无法将Schedulers.io() 上的操作与SharedPrefs.commit() 同步。所有电话都是同时进行的,因此所有电话都尝试同时注销。
我想要实现的是只有第一个触发注销,剩下的两个注意到它发生了并且根本没有触发任何东西。
建筑
我有 3 个 API 调用,它们使用令牌进行自动处理。
令牌保存在 SharedPrefs 中。
所有 API 调用都在 Schedulers.io() 上进行。
当调用令牌刷新失败时,我正在尝试使用注销方法从我的SharedPrefs 中删除数据。
下面是注销方法代码:
Flowable.fromCallable { isUserLogged() }
.filter { it }
.flatMap { logoutUseCase.execute() }
.doOnComplete { showLogin() }
.subscribeOn(Schedulers.single())
.blockingSubscribe()
此方法在连接到OkHttpClient 的Authenticator 类中调用,并与Retrofit 一起使用
【问题讨论】:
-
我不认为 rx 可以帮助你进行同步,除非你愿意在调用 1 之后发生调用 2 和 3。
SharedPrefs应该是线程安全的,但它有一个不同的锁阅读和写作。由于您正在执行写入->读取,我建议您使用自己的锁将注销代码包装在某种LoginManager中。 -
我建议重新考虑您的实施。如果您在使用 Rx 时遇到竞争条件,那么您使用 Rx 不正确。尝试退后一步,重新考虑您要完成的工作。
-
@WoogieNoogie 问题不在 RxJava 中。问题是 RxJava 进行的异步调用(正确的和期望的)都与未同步的应用程序的一部分通信,因此所有这些都具有过时的信息。
标签: android rx-java rx-android