Android Rxjava2+;谷歌登录Firebase
我正在尝试使用RxJava方法将Google SignIn for Firebase集成到我的应用程序中。但由于某种原因,它很慢。我在解决这个问题的方法中使用了嵌套的观察值。有人能为这个问题提出更好、更有效的解决方案吗 这是我的代码的逐步演练 用户点击谷歌登录按钮Android Rxjava2+;谷歌登录Firebase,android,firebase-authentication,google-signin,google-authentication,rx-java2,Android,Firebase Authentication,Google Signin,Google Authentication,Rx Java2,我正在尝试使用RxJava方法将Google SignIn for Firebase集成到我的应用程序中。但由于某种原因,它很慢。我在解决这个问题的方法中使用了嵌套的观察值。有人能为这个问题提出更好、更有效的解决方案吗 这是我的代码的逐步演练 用户点击谷歌登录按钮 @OnClick(R.id.googleButton) void googleSignUpButtonClicked() { // Configure sign-in to request the user's
@OnClick(R.id.googleButton)
void googleSignUpButtonClicked() {
// Configure sign-in to request the user's ID, email address, and basic
// profile. ID and basic profile are included in DEFAULT_SIGN_IN.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
// Build a GoogleApiClient with access to the Google Sign-In API and the
// options specified by gso.
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.enableAutoManage(getActivity(), new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
} /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
以上是一个简单的复制粘贴,为那些感兴趣的人。
然后在onActivityResult()中调用我的函数进行“签名”:
同样,这是一个简单的复制粘贴
在firebaseAuthWithGoogle()
myObservable
Sign's-In用户中,然后附加到此Observable
的Observable创建另一个Observable,检查用户是否存在于my firebase中
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
authenticateWithCredential = new DisposableObserver<AuthResult>() {
private DatabaseReference databaseReference;
private FirebaseUser firebaseUser;
@Override
public void onNext(AuthResult authResult) {
databaseReference = FirebaseDatabase.getInstance().getReference();
firebaseUser = authResult.getUser();
}
@Override
public void onError(Throwable e) {
Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
//checkUserExists.dispose();
checkIfUserExists(databaseReference, firebaseUser);
}
};
FirebaseAuthorization.observableSignInWithCredential(mAuth, credential)
.observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(authenticateWithCredential);
}
private void firebaseAuthWithGoogle(谷歌签名帐户){
Log.d(标记为“firebaseAuthWithGoogle:+acct.getId());
AuthCredential credential=GoogleAuthProvider.getCredential(acct.getIdToken(),null);
authenticateWithCredential=new DisposableObserver(){
私有数据库参考数据库参考;
私有FirebaseUser FirebaseUser;
@凌驾
public void onNext(AuthResult AuthResult){
databaseReference=FirebaseDatabase.getInstance().getReference();
firebaseUser=authResult.getUser();
}
@凌驾
公共无效申报人(可丢弃的e){
Toast.makeText(getActivity(),e.toString(),Toast.LENGTH_SHORT).show();
}
@凌驾
未完成的公共空间(){
//checkUserExists.dispose();
checkIfUserExists(databaseReference,firebaseUser);
}
};
FirebaseAuthorization.observableSignInWithCredential(mAuth,credential)
.observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.订阅(使用凭证进行身份验证);
}
检查用户是否存在
public void checkIfUserExists(DatabaseReference databaseReference, FirebaseUser firebaseUser) {
checkUserExists = new DisposableObserver<DataSnapshot>() {
@Override
public void onNext(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
SharedPreferences pref = getActivity().getSharedPreferences("GoogleFacebook", MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString("username", dataSnapshot.toString());
editor.apply();
} else {
enterUsernameDialog = new MaterialDialog.Builder(getActivity())
.title("Almost There!")
.content("Give us an Awesome Username to Identify Yourself")
.inputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PERSON_NAME)
.positiveText("Submit!")
.inputRange(4, 16)
.canceledOnTouchOutside(false)
.alwaysCallInputCallback() // this forces the callback to be invoked with every input change
.input("Username", "", new MaterialDialog.InputCallback() {
@Override
public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
if (input.toString().length() > 3 && input.toString().length() < 16) {
dialog.getActionButton(DialogAction.POSITIVE).setEnabled(true);
}
}
}).onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
//showIndeterminateProgressDialog(false);
Toast.makeText(getActivity(), dialog.getInputEditText().getText().toString(), Toast.LENGTH_SHORT).show();
}
}).autoDismiss(false).show();
}
}
@Override
public void onError(Throwable e) {
Toast.makeText(getActivity(), "I do Exist: Error", Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
Toast.makeText(getActivity(), "I do Exist: Complete", Toast.LENGTH_SHORT).show();
}
};
observableSingleValueEvent(databaseReference.child("usersID").child(firebaseUser.getUid()))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(checkUserExists);
}
public void checkIfUserExists(DatabaseReference DatabaseReference,FirebaseUser FirebaseUser){
checkUserExists=new DisposableObserver(){
@凌驾
public void onNext(DataSnapshot DataSnapshot){
if(dataSnapshot.exists()){
SharedReferences pref=getActivity().getSharedReferences(“谷歌Facebook”,MODE_PRIVATE);
SharedReferences.Editor=pref.edit();
putString(“用户名”,dataSnapshot.toString());
editor.apply();
}否则{
enterUsernameDialog=new MaterialDialog.Builder(getActivity())
.title(“快到了!”)
.content(“给我们一个非常棒的用户名来识别你自己”)
.inputType(inputType.TYPE\u CLASS\u文本|
输入类型。类型\文本\变体\人员\姓名)
.positiveText(“提交!”)
.输入范围(4,16)
.canceledOnTouchOutside(假)
.alwaysCallInputCallback()//这强制在每次输入更改时调用回调
.input(“用户名”,“新材料对话框.InputCallback()){
@凌驾
public void onInput(@NonNull MaterialDialog对话框,CharSequence输入){
if(input.toString().length()>3&&input.toString().length()<16){
dialog.getActionButton(DialogAction.POSITIVE).setEnabled(true);
}
}
}).onPositive(新材料对话框.SingleButtonCallback(){
@凌驾
public void onClick(@NonNull MaterialDialog,@NonNull DialogAction which){
//showIndeterminateProgressDialog(假);
Toast.makeText(getActivity(),dialog.getInputItemText().getText().toString(),Toast.LENGTH_SHORT).show();
}
}).autodismise(false).show();
}
}
@凌驾
公共无效申报人(可丢弃的e){
Toast.makeText(getActivity(),“我确实存在:错误”,Toast.LENGTH_SHORT.show();
}
@凌驾
未完成的公共空间(){
Toast.makeText(getActivity(),“我确实存在:完成”,Toast.LENGTH\u SHORT.show();
}
};
observableSingleValueEvent(databaseReference.child(“usersID”).child(firebaseUser.getUid()))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.订阅(checkUserExists);
}
首先,由于某些原因,这太慢了。其次,在MaterialDialogenterUsernameDialog
显示之前,会调用toast:“我确实存在:完成”
有人能描述一种比我所做的更好的方法吗 更新日期:2017年2月1日
在对这个主题进行了大量的研究之后,我终于成功了。我使用了RxJava中的一个名为concatMap
的操作符,而不是上面那堆嵌套的可观察对象。如果你愿意,你可以查一下。我将向您展示下面的代码,以帮助您更好地理解
FirebaseAuthorization.observableSignInWithCredential(mAuth, credential)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.concatMap(new Function<AuthResult, Observable<DataSnapshot>>() {
@Override
public Observable<DataSnapshot> apply(AuthResult authResult) throws Exception {
databaseReference = FirebaseDatabase.getInstance().getReference();
firebaseUser = authResult.getUser();
progressDialog.setContent("Transferring Your User Data From Google To My App!");
return observableSingleValueEvent(databaseReference.child("usersID").child(firebaseUser.getUid()));
}
}).subscribe(checkUserExists);
FirebaseAuthorization.observableSignInWithCredential(mAuth,credential)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.concatMap(新函数(){
@凌驾
FirebaseAuthorization.observableSignInWithCredential(mAuth, credential)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.concatMap(new Function<AuthResult, Observable<DataSnapshot>>() {
@Override
public Observable<DataSnapshot> apply(AuthResult authResult) throws Exception {
databaseReference = FirebaseDatabase.getInstance().getReference();
firebaseUser = authResult.getUser();
progressDialog.setContent("Transferring Your User Data From Google To My App!");
return observableSingleValueEvent(databaseReference.child("usersID").child(firebaseUser.getUid()));
}
}).subscribe(checkUserExists);