Adi*_*Adi 32 android firebase firebase-authentication
我已开始使用新的Firebase SDK.
当我正在进行用户登录时,我的onAuthStateChanged方法被调用两次,状态相同(等用户登录).
我确定我只将一次AuthStateListener添加到FirebaseAuth引用中.
有帮助吗?
Fab*_*cio 35
是的,这非常烦人.这是一次注册电话.不仅如此,onAuthStateChanged将在许多不同的状态中被多次调用,不可能知道它是哪个状态.
文件说:
onAuthStateChanged(FirebaseAuth auth)
在验证状态发生变化的UI线程中调用此方法:
在听众注册之后
用户登录时
- 当前用户退出时
- 当前用户更改时
- 当前用户的令牌发生变化时
这里有一些提示来发现当前状态:
这个听众是一个混乱和非常错误的人.Firebase团队应该调查一下.
我的解决方法是使用全局声明的布尔值来标记onAuthStateChanged之前是否需要调用.
private Boolean authFlag = false;
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) {
if (firebaseAuth.getCurrentUser() != null) {
if(authFlag== false) {
// Task to perform once
authFlag=true;
}
}
}
};
Run Code Online (Sandbox Code Playgroud)
虽然此处提供的其他答案可能会完成这项工作,但我发现管理标志既麻烦又容易出错。
我更喜欢在短时间内消除事件。假设用户在 200 毫秒内登录然后注销是不太可能的,甚至是不可能的。
TLDR
去抖动意味着在处理事件之前,您等待查看同一事件是否会在预定义的时间段内再次触发。如果是,则重置计时器并再次等待。如果没有,您处理该事件。
这是一个 Android 问题,这不是我的领域,但我确信 android 提供了某种可以帮助完成任务的工具。如果没有,您可以使用一个简单的计时器制作一个。
下面是 Javascript 实现的样子:
var debounceTimeout;
const DebounceDueTime = 200; // 200ms
function onAuthStateChanged(auth)
{
if (debounceTimeout)
clearTimeout(debounceTimeout);
debounceTimeout = timeout(() =>
{
debounceTimeout = null;
handleAuthStateChanged(auth);
}, DebounceDueTime);
}
function handleAuthStateChanged(auth)
{
// ... process event
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6463 次 |
| 最近记录: |