美文网首页
RxPermission的隐藏bug

RxPermission的隐藏bug

作者: 0一缕星光0 | 来源:发表于2021-04-17 14:31 被阅读0次

    起因

    在测试测功能的时候,发现获取权限的回调回调了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

          本文链接:https://www.haomeiwen.com/subject/mmuulltx.html