同步获取Firebase用户令牌

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同步获取Firebase用户令牌相关的知识,希望对你有一定的参考价值。

我正在尝试使用Firebase令牌来验证我对Rest API的调用。我可以使用以下代码异步生成令牌。

    FirebaseUser mUser = App.getFirebaseAuth().getCurrentUser();
    if (mUser!=null) {
        mUser.getIdToken(false)
                .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
                    public void onComplete(@NonNull Task<GetTokenResult> task) {
                        if (task.isSuccessful()) {
                            ID_TOKEN = task.getResult().getToken();
                        } else {
                            Log.e(App.TAG, "Firebase Token task ended with error.");
                        }
                    }
                });
    } else {
        Log.i(App.TAG,"User is null, no Firebase Token available");
    }

ID_TOKEN是一个保存结果的静态字符串变量。问题是,我正在构建我的请求并添加身份验证标头。

        headers.put("Authentication",
                "Bearer  + ID_TOKEN);

问题是,由于Firebase令牌是异步检索的,因此ID_TOKEN变量的某些用户是空的。我试图强制线程等待任务使用

Tasks.await(任务)

但我得到一个例外,说在主线程中无法调用await。

有没有其他方法同步获取令牌,或让线程等到任务完成?

答案

强制某些东西在主线程上同步运行是一个非常糟糕的主意。它可能会锁定您的应用程序,并可能导致它到ANR。这就是为什么当你试图运行Tasks.await()android会抱怨 - 它知道可能存在问题。

学习如何以正确的方式执行异步编程要好得多。您必须在您必须提供的侦听器中接收令牌。

Please read this blog了解有关Firebase API异步原因的更多信息。

另一答案

如果可能,只需将所有后续操作(如headers.put(...))移动到onComplete块中。这将保证执行顺序。

以上是关于同步获取Firebase用户令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何获取片段内在firebase中注册的用户数?

我是不是需要每次都从 Firebase 获取用户令牌 [关闭]

验证 Firebase ID 令牌与获取用户数据

如何通过 Firebase Google 身份验证获取带有刷新令牌的 YouTube 数据 API 访问令牌?

在Firebase中创建用户后获取身份提供商令牌

Firebase React Native——如何获取和传输设备 ID/令牌?