Flow是kotlin協(xié)程的一個類似RxJava的流式API抚垃,它的出現(xiàn)可以替代RxJava,這里就介紹RxJava之前熱門的權限框架RxPermission的替代
1. RxPermission中存在的嚴重的BUG,
舉例如下代碼, Camera權限拒絕, READ_PHONE_STATE允許訂閱回調(diào)值就是true(調(diào)試BUG前提兩權限都沒申請過)
RxPermissions(this).request(Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA)
從RxPermission原碼中截取的一部分原碼:
@TargetApi(Build.VERSION_CODES.M)
private Observable<Permission> requestImplementation(final String... permissions) {
List<Observable<Permission>> list = new ArrayList<>(permissions.length);
List<String> unrequestedPermissions = new ArrayList<>();
......
return Observable.concat(Observable.fromIterable(list));
}
從最后一行代碼可以看出是將List中的多個Observable<Permission>合并成一個,問題也是出在這里缺狠,而concat 操作符是接收若干個Observables细睡,而權限請求onRequestPermissionsResult回調(diào)卻不一定是按請求時的順序來的才導致這個問題,而如果將concat改成merge時,第一次請求未回調(diào)完成前再去請求權限組, 這時就會出現(xiàn)回調(diào)多次的情況
如何解決: 權限請求在回調(diào)時會一般是觸發(fā)界面彈窗提示, 而在第一次的請求權限組回調(diào)全部完成前, 這時再去請求權限會立刻回調(diào)空的數(shù)組, 直到第一次請求的權限組回調(diào)完成, 所以在第一次請求權限組時將需要返回的權限數(shù)據(jù)源直接放到到一個Observable中, 多次請求權限時無效返回Empty的Observable
2. FlowPermission 使用協(xié)程的Flow流式方式回調(diào)權限申請
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.youxiaochen:FlowPermission:1.2.0'
}
lifecycleScope.launch {
flowPermission.requestEach(Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA)
.collect { Log.d("FlowPermission", "collect permission = $it")}
}