这是从Google+登录中使用的GoogleApiClient获取令牌的传统方式:
String token = GoogleAuthUtil.getToken(apiClient.getContext(), getAccountNameFromGoogle(apiClient), SCOPE);
Run Code Online (Sandbox Code Playgroud)
但是,GetAccountNameFromGoogle
方法需要android.permission.GET_ACCOUNTS
权限,并且在Android M开发人员预览版3中,此权限现在标记为危险并分组为联系人组.这意味着,如果有人想登录我的应用程序,他需要授予我的应用程序完整的联系人权限,这有点矫枉过正.
有没有办法在GET_ACCOUNTS
未经许可的情况下实现这一目标
我找到的一个可能的答案是从AccountPicker获取帐户名称,但这迫使用户选择他的帐户两次(一次用于Google Plus身份验证,一次用于AccountPicker),这也不是非常友好的解决方案.
假设我有一个事件发射数据源,我想将其转换为反应流.数据源由资源绑定(例如,定期发送更新状态的套接字),因此我希望共享该资源的单个订阅.使用单个observable replay
(对于新订户立即获得当前值),refCount
运营商似乎非常适合这种情况.例如,这是他的MyDataProvider
单身人士的样子:
private final Observable<MyData> myDataObservable = Observable.<MyData>create(emitter -> {
// Open my resource here and emit data into observable
})
.doOnDispose(() -> {
// Close my resource here
})
.replay(1)
.refCount();
public Observable<MyData> getMyDataObservable() {
return myDataObservable;
}
Run Code Online (Sandbox Code Playgroud)
但是,现在假设我有另一个数据源需要第一个数据源的结果来计算自己的值:
private final Observable<AnotherData> anotherDataObservable = getMyDataProvider().getMyDataObservable()
.flatMap(myData -> {
// Call another data source and return the result here
})
public Observable<AnotherData> getAnotherDataObservable() {
return anotherDataObservable;
}
Run Code Online (Sandbox Code Playgroud)
在这里,我的设置开始崩溃.第一个可观测量的多播仅适用于refCount
操作员.在那之后,一切都再次单播.这意味着如果进行两次单独的订阅anotherDataProvider
,flatMap
则将调用operator两次.我看到了两个解决方法,但我不喜欢这两个: