在我的应用程序中,当用户注销时,它应该向服务器发送请求以指示用户已注销并清理服务器端的内容。
在用户成功退出Firebase后发送它是有意义的。我正在使用具有signOut功能的Firebase UI,它返回一个Task对象,可用于检查用户是否成功注销,如果成功则发送请求。
但是当我尝试使用getToken()为请求生成令牌时,尽管FirebaseUser对象不为null,它仍然给我NullPointerException。
public void signOut(View v) {
AuthUI.getInstance()
.signOut(this)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
serverCleanUp(); // make sure the user sign out successfully before sending to server
} else {
// handle error...
}
}
});
}
public void serverCleanUp() {
// mUser is the user object saved when signed in
if (mUser != null) {
mUser.getToken(true) // give me NullPointerException in this line
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
// send request if success, handle error otherwise...
}
});
}
}
我认为这是因为当用户退出时,Firebase不希望用户生成令牌来执行请求。但是当我阅读doc时,它表示Firebase用户对象即使在注销后仍然可以完全正常运行,这是否意味着除了getToken之外一切都有用?
编辑:这不是由mUser
引起的nullPointerException为null,因为我确保它不为null,并且我尝试调用另一个FirebaseUser方法,例如getEmail()在getToken()之前看它是否正常工作,并且getEmail正常工作,而getToken仍然抛出nullPointerException。
堆栈跟踪:
java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.internal.zzbmn com.google.firebase.auth.FirebaseUser.zzVI()' on a null object reference
at com.google.firebase.auth.FirebaseAuth.zza(Unknown Source)
at com.google.firebase.auth.FirebaseUser.getToken(Unknown Source)
at com.example.user.myapp.MainActivity.serverCleanUp(MainActivity.java:232)
at com.example.user.myapp.MainActivity.access$500(MainActivity.java:36)
at com.example.user.myapp.MainActivity$5.onComplete(MainActivity.java:219)
at com.google.android.gms.tasks.zzc$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)