本人是做设备相关的应用开发,在项目中遇到了一种奇葩的设计:
APP发送某功能指令给设备,设备收到后返回一个收到指令的响应,表示设备已经收到指令了,等设备完成动作后,会再次返回一个响应,表示操作的结果。即一次请求,两次响应。
为了更加明白的阐述问题,用一个图来进行说明:
只要APP和设备的连接没有断开,一般情况下第一个响应很快就会收到,第二个响应相对久一点返回。此外,第一个响应不是使用EventBus post() 过来的,而第二个响应是EventBus post() 过来的。有的朋友说也可以在@Subscribe方法中更新界面,当然这样也可以。但是在此种情况下,EventBus虽然能解耦,也会使业务代码分散,难以阅读和维护。业务逻辑使用RxJava实现,用过RxJava的人应该都有体会,调用链断开是比较难受的。
为了解决这个问题,即使业务流不那么分散,我想到了zip() 操作符,我把整个请求流程看作两个请求,然后合成一个请求来写业务流。不啰嗦,上代码。
public class MainActivity extends AppCompatActivity {
Observable<Integer> observable1;
PublishSubject<Integer> observable2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this)