如何在android中等待firebase pushtoken

如何在android中等待firebase pushtoken,android,firebase,push-notification,firebase-cloud-messaging,Android,Firebase,Push Notification,Firebase Cloud Messaging,我正在使用firebase通知。有时我不能按时拿到pushtoken。我怎么能等呢 pushToken = firebaseIDService.getToken(); //SOME CODE registerUser(pushToken); 所以,我只想停止该函数,直到得到getToken()的结果 谢谢。令牌是异步生成的,可以定期刷新。要确保您的应用程序使用最新的令牌,请按照以下文档中所示实施FirebaseInstanceService.onTokenRefresh: 每当生成新令牌时,o

我正在使用firebase通知。有时我不能按时拿到pushtoken。我怎么能等呢

pushToken = firebaseIDService.getToken();
//SOME CODE
registerUser(pushToken);
所以,我只想停止该函数,直到得到getToken()的结果


谢谢。

令牌是异步生成的,可以定期刷新。要确保您的应用程序使用最新的令牌,请按照以下文档中所示实施
FirebaseInstanceService.onTokenRefresh

每当生成新令牌时,
onTokenRefreshcallback
就会触发,因此在其上下文中调用
getToken
可以确保您正在访问当前可用的注册令牌。确保已将服务添加到清单中,然后在
onTokenRefresh
的上下文中调用
getToken
,并记录值,如图所示:

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // Instance ID token to your app server.
    sendRegistrationToServer(refreshedToken);
}

上面代码段中的
sendRegistrationToServer
函数是您自己实现的,因此很可能相当于代码中的
registerUser
警告!不要在主线程上使用它! 而且,这是一种不好的做法(可能),最好使用@FrankvanPuffelen的答案。 我不确定它是否有效,但我对一些异步操作使用相同的方法

@WorkerThread
public String getTokeSync(Context context) {
    String token = FirebaseInstanceId.getInstance().getToken();
    if (token != null)
        return token;
    IntentFilter filter = new IntentFilter();
    filter.addAction("com.google.android.c2dm.intent.RECEIVE");
    filter.addCategory(BuildConfig.APPLICATION_ID);
    final CountDownLatch lock = new CountDownLatch(1);
    final FirebaseInstanceIdReceiver br = new FirebaseInstanceIdReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            token = FirebaseInstanceId.getInstance().getToken();
            lock.countDown();
            context.unregisterReceiver(this);
        }
    }
    context.registerReceiver(br, filter);
    lock.await(); // Better use await with timeout
    return token;
}

您没有按时获得令牌是什么意思?因为这是一个异步任务,getToken start但函数的其余部分继续。因此,在getToken返回任何内容之前调用registerUser()。那么,将register user放入异步任务的onPostExecute中如何使用回调实现它呢?
onTokenRefresh
是回调是的,我理解,但我无法从该方法访问另一个类(其中我有registerUser)。在这个类中,我可以创建一个firebaseIDService实例(这就是我正在做的)来调用getToken。我怎么能叫另一个班?很抱歉,我在这方面有点慢。即使没有打开任何活动,您的
FirebaseInstancedService
子类也会在后台运行,因此它的生命周期可能与以前不同。您必须将
registerUser()
方法移动到一个可以从
onTokenRefresh()
调用它的位置。