Android Rxjava2+;谷歌登录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

我正在尝试使用RxJava方法将Google SignIn for Firebase集成到我的应用程序中。但由于某种原因,它很慢。我在解决这个问题的方法中使用了嵌套的观察值。有人能为这个问题提出更好、更有效的解决方案吗

这是我的代码的逐步演练

用户点击谷歌登录按钮

@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()
my
Observable
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);
}
首先,由于某些原因,这太慢了。其次,在MaterialDialog
enterUsernameDialog
显示之前,会调用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);