我为Firebase创建了一个登录系统。用户可以使用用户名或密码进行身份验证。这可以通过在firebase数据库中创建一个链接用户名和电子邮件的表来实现。
问题在于,当用户注册时,他可以在" createUserWithEmailAndPassword()"之间做任何事情。调用firebase及其完成处理程序,我将用户添加到数据库。例如:返回上一个活动,暂停应用程序暂停,旋转屏幕,... 如果用户正在做这些事情,则可能是用户已注册但未写入数据库
如何确保此交易全部或全部?我想过使用一个在完成时自动停止的intentservice,但这真的是要走的路吗?
private void register(final String email,final String username,final String password)
{
mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>()
{
@Override
public void onComplete(@NonNull Task<AuthResult> task)
{
Log.d("FIREBASE Register", "createUserWithEmail:onComplete:" + task.isSuccessful());
showProgress(false);
if(task.isSuccessful())
{
Resources res = getResources();
SharedPreferences prefs = getSharedPreferences(res.getString(R.string.package_name), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("email", email);
editor.putString("password", password);
editor.commit();
// Write new user
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
writeNewUser(user.getUid(), username, email);
// Send verification email
sendVerificationEmail();
// Sign out the user, to block the loginActivity from logging in the user (the email isn't verified)
FirebaseAuth.getInstance().signOut();
}
}
}
答案 0 :(得分:0)
我认为这是最好的方法,因为如果用户离开应用程序,会迫使他再做一切
@Override
public void onDestroy() {
final FirebaseAuth mAuth=FirebaseAuth.getInstance();
final FirebaseUser user=mAuth.getCurrentUser();
final DatabaseReference mdatabase=FirebaseDatabase.getInstance().getReference().child("USERS NODE").child(user.getUid());
mdatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot==null){
//DATA HAS NOT BEEN SUMBITED
if(user!=null){
user.delete()
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
}
}
});
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
答案 1 :(得分:0)
我通过使用服务来修复它,但经过长时间的研究后我发现将mAuth.createUserWithEmailAndPassword方法委托给HandlerThread也是一个很好的解决方案
来源:https://www.youtube.com/watch?v=adPLIAnx9og&t=78s (使用camera.open和onpreview回调的示例)