android – 使用RxJava在单个线程上链接请求
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了android – 使用RxJava在单个线程上链接请求,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1922字,纯文字阅读大概需要3分钟。
内容图文
我将用户的位置保存在应用程序本地数据库中,然后将其发送到服务器.服务器返回成功后,我会删除已发送的位置.
每次在数据库中保存一个点时,我都会调用此方法:
public void sendPoint(){
amazonRetrofit.postAmazonPoints(databaseHelper.getPoints())
.map(listIdsSent -> deleteDatabasePoints(listIdsSent))
.doOnCompleted(() -> emitStoreChange(finalEvent))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.from(backgroundLooper))
.subscribe();
}
>我在数据库中查询要发送到服务器的点
>我从服务器收到成功发送的点列表
>使用.map(),我收集成功发送的点并从本地数据库中删除它们
有时,碰巧我反复调用此方法而不等待先前的请求完成并删除发送的点.因此,当我再次调用该方法时,它将发布与前一个请求相同的点,因为之前的请求尚未完成,因此尚未使用.map()删除该点.导致服务器接收重复…
时间线
>第一次调用postPoint()
>从数据库中检索A,B,C点
>将A,B,C点发送到服务器
>第二次调用postPoint()
>从数据库中检索A,B,C,D点
>将A,B,C,D点发布到服务器
>从第一个请求获得成功
>从本地数据库中删除A,B,C
>从第二个请求获得成功
>从本地数据库中删除A,B,C,D
结果:
服务器数据库现已收到:A,B,C,A,B,C,D
每个请求都按顺序发生,但是当我太快地调用sendPoint()时,会以某种方式将相同的位置点发送到服务器.我怎样才能解决这个问题?
解决方法:
首先,你没有正确使用observerOn运算符,一旦定义了,就会对管道中的步骤应用observeOn运算符.
因此,如果您在subscribeOn之前定义管道的末尾,那么您之前的所有步骤都不会在该线程中执行.
此外,由于您需要等到服务器调用的响应,您可以使用Subscriber已经提供的回调处理程序(onNext(),onComplete())
public void sendPoint(){
Observable.from(databaseHelper.getPoints())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(poins-> amazonRetrofit.postAmazonPoints(points))
.subscribeOn(AndroidSchedulers.from(backgroundLooper))
.subscribe(listIdsSent-> deleteDatabasePoints(listIdsSent), () -> emitStoreChange(finalEvent));
}
如果你想看到ObserverOn和SubscribeOn的更多例子,你可以看看这里. https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/scheduler/ObservableAsynchronous.java
内容总结
以上是互联网集市为您收集整理的android – 使用RxJava在单个线程上链接请求全部内容,希望文章能够帮你解决android – 使用RxJava在单个线程上链接请求所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。