我有一点问题,在onStop
我MainActivity
上传到firebase一些数据,所以,如果我快速切换到我的退出活动并按SignOut
,我执行一个SignOut
,但当时我注销数据仍在上传,所以,当我退出时我得到我的GetCurrentUser = null,所以数据不能上传和我的应用程序崩溃,在我退出时我想检查用户是否在注销之前上传了所有内容,我在我的onCompletionListeners
中添加了MainActivity.class
,所以我可以处理如果用户为空,但它一直崩溃,我想我需要在我之前做结账按下SignOut按钮,所以,我检查数据是否全部上传,然后LogOut,我在过去一周内解决了这个问题并且它变得很烦人。
以下是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");
}
}
});
}
这是我的其他课程中的SignOut按钮
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();
}
}
答案 0 :(得分:0)
在保存任何数据之前检查当前用户是否为空。
form_key=kcE3W2vzParNhPN5&options%5B1508%5D=2025&options%5B1509%5D=1234&options%5B1510%5D=5678&options%5B1511%5D=&options%5B1512%5D=&options%5B1513%5D=&productId=59891
答案 1 :(得分:0)
你可以做两件事。
设置上传标志。 在上传开始之前,您可以放置一个标志。上传完成后,设置要由firebase回调函数删除的标志。因此,当标志打开时,请不要单击“注销”按钮。
为SignOut设置标志。 单击SignOut按钮时,标志会打开。在回调函数中的每个上传请求之后检查标志。如果标志打开,则SignOut正常工作。
我的观点是第一种方法比第二种更普遍。但第二个更接近Firebase中的异步特性。