【问题标题】:Firebase SignOut returning null on GetCurrentUser.GetUidFirebase SignOut 在 GetCurrentUser.GetUid 上返回 null
【发布时间】:2017-12-22 13:51:39
【问题描述】:

我有一个小问题,在我的onStop 中我的MainActivity 我正在上传一些数据到firebase,所以,如果我快速切换到我的注销活动并按SignOut,我执行SignOut,但是当时我正在注销数据仍在上传,所以,当我注销时,我得到我的 GetCurrentUser = null ,所以数据仍然无法上传并且我的应用程序崩溃,在我的注销中我想检查用户是否已经上传了所有之前注销,我在MainActivity.class 中添加了onCompletionListeners,所以如果用户为空,我可以处理,但它一直在崩溃,我想我需要在按下SignOut 按钮之前进行结帐,所以,我检查数据是否已全部上传,然后注销,我在过去一周一直在解决这个问题,并且越来越烦人。

这是我在MainActivity.class上传的内容

myref.putStream(groups)
                            .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                                @Override
                                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                                    @SuppressWarnings("VisibleForTests") Uri downloadUrlGrupos = taskSnapshot.getDownloadUrl();

                                        mDatabase.child("Users").child(mAuth.getCurrentUser().getUid()).child("groups").setValue(downloadUrlGrupos.toString(), new DatabaseReference.CompletionListener() {
                                            @Override
                                            public void onComplete(DatabaseError databaseError, DatabaseReference groupsReference) {
                                                if(groupsReference!=null){
                                                    Log.d("TAG", "Se guardo correctamente url Grupos");
                                                }else
                                                {
                                                    Log.d("TAG", "Error al subir url Grupos");
                                                }


                                            }
                                        }); 





                                }

这是我在其他类中的注销按钮

  button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {


                   //I think here need to be a check , so i first check if all the data is uploaded to firebase, and then SignOut


                         Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(new ResultCallback<Status>() {
                             @Override
                             public void onResult(@NonNull Status status) {

                                 FirebaseAuth.getInstance().signOut();
                                 mGoogleApiClient.disconnect();
                                 finish();
                             }
                         });

整个 OnStop

 @Override
    protected void onStop() {
        super.onStop();


                   if(mAuth.getCurrentUser()!=null){





                    referenciaGrupos.putStream(g)
                            .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                                @Override
                                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                                    @SuppressWarnings("VisibleForTests") Uri downloadUrlG = taskSnapshot.getDownloadUrl();

                                        mDatabase.child("user").child(mAuth.getCurrentUser().getUid()).child("URL_g").setValue(downloadUrlG.toString(), new DatabaseReference.CompletionListener() {
                                            @Override
                                            public void onComplete(DatabaseError databaseError, DatabaseReference referenciaG) {
                                                if(referenciaG!=null){
                                                    Log.d("TAG", "Se guardo correctamente url G");
                                                }else
                                                {
                                                    Log.d("TAG", "Error al subir url G");
                                                }


                                            }
                                        }); 





                                }
                            });
                    referenciaPictos.putStream(p).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                            @SuppressWarnings("VisibleForTests") Uri downloadUrlP = taskSnapshot.getDownloadUrl();

    mDatabase.child("User").child(mAuth.getCurrentUser().getUid()).child("URL_p").setValue(downloadUrlP.toString(), new DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError databaseError, DatabaseReference referenciaP) {
            if(referenciaP!=null){

                Log.d("TAG", "Se guardo correctamente url P");
            }else{
                Log.d("TAG", "Error al subir url P");
            }



        }
    }); 



                        }
                    });
                    referenciaF.putStream(fG).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            @SuppressWarnings("VisibleForTests") Uri downloadUrlF = taskSnapshot.getDownloadUrl();


                                mDatabase.child("User").child(mAuth.getCurrentUser().getUid()).child("URL_f").setValue(downloadUrlF.toString(), new DatabaseReference.CompletionListener() {
                                    @Override
                                    public void onComplete(DatabaseError databaseError, DatabaseReference referenciaF) {
                                        if(referenciaF!=null){
                                            Log.d("TAG", "Se guardo correctamente url F");
                                        }else{

                                            Log.d("TAG", "Error al subir url F");
                                        }

                                    }
                                });




                        }
                    });


                   }else{
                       Log.d("TAG","El usuario es null");
                       Toast.makeText(this, "ERROR, SUBIENDO ARCHIVOS", Toast.LENGTH_SHORT).show();
                   }
    }

【问题讨论】:

    标签: android firebase firebase-authentication


    【解决方案1】:

    在保存任何数据之前检查当前用户是否为空。

     myref.putStream(groups)
                        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
    
                                @SuppressWarnings("VisibleForTests") Uri downloadUrlGrupos = taskSnapshot.getDownloadUrl();
    
                                if (mAuth.getCurrentUser() != null) {
                                    mDatabase.child("Users").child(mAuth.getCurrentUser().getUid()).child("groups").setValue(downloadUrlGrupos.toString(), new DatabaseReference.CompletionListener() {
                                        @Override
                                        public void onComplete(DatabaseError databaseError, DatabaseReference groupsReference) {
                                            if (groupsReference != null) {
                                                Log.d("TAG", "Se guardo correctamente url Grupos");
                                            } else {
                                                Log.d("TAG", "Error al subir url Grupos");
                                            }
    
    
                                        }
                                    });
                                }
    
    
                            }
                        });
    

    【讨论】:

    • 是的,我在 onStop 之后立即做,我有所有的参考资料,但它似乎一直在崩溃
    • 你能上传整个代码吗?包括你的 onStop 方法
    【解决方案2】:

    你可以做两件事。

    1. 设置上传标志。 在上传开始之前,您可以放置​​一个标志。上传完成后,将标志设置为由 firebase 回调函数删除。因此,当标志打开时,不要让“退出”按钮被点击。

    2. 为 SignOut 设置一个标志。 当您单击 SignOut 按钮时,会打开一个标志。在回调函数中的每个上传请求后检查标志。如果标志打开,则使 SignOut 工作。

    我的意见是第一种方法比第二种方法更通用。但第二个更接近 Firebase 中的异步特性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 2020-01-26
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 2020-07-12
      • 2017-02-19
      相关资源
      最近更新 更多