RxPermission的隐藏bug

起因

在测试测功能的时候,发现获取权限的回调回调了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的解决方案,目前看其实是已经过时的了,所以只需要简单的删除就可以了。

PR & Issues

pr链接
Issues

你可能感兴趣的:(RxPermission的隐藏bug)