起因
在测试测功能的时候,发现获取权限的回调回调了2次,导致将接下来的网络请求连续发出2次请求,继而bug发生。
Code
猜下下面这段代码会打印出什么结果?
RxPermissions(this).request(WRITE_EXTERNAL_STORAGE).subscribe()
RxPermissions(this).request(WRITE_EXTERNAL_STORAGE).subscribe { println("get permission") }
照理说,应该只会打印一次"get permission"
吧,可是实际上呢,打印了2次!!
分析
在request
方法中,我发现调用了oneOf
方法进行选择,而其中有一个分支返回了Observable.merge
,merge
就意味着会有2个生产者Observable
,有2个生产者,就意味着要有2个消费者来处理,对应到代码里,就是回调中的requestImplementation
方法会执行2次。
这就要考虑什么时候会执行到这个分支,以及为什么之前的代码都没有人触发这个bug呢?
在代码中,merge
的参数是pending
的返回值,在大多数情况下返回的是Observable.empty()
,也就是说merge其实就是merge了一个emptyObservable.merge(trigger, Observable.empty())
,这样只会有一个生产者产生。但是如果第一行代码执行,但是并没有等到授权弹窗出现并返回就执行了第二行代码,那么RxPermissionsFragment
中的mSubjects
就没有被清除,这时候pending
函数返回的就是一个Observable.just(TRIGGER)
生产者了,在通过merge
就会出现2个生产者,最终导致println
回调执行2次。
解决方法
其实通过查看代码记录,发现oneOf
,merge
其实是为了解决被拒绝后没法在弹出授权dialog的解决方案,目前看其实是已经过时的了,所以只需要简单的删除就可以了。
网友评论