0

中等待firebase pushtoken我正在使用Firebase通知。有些時候我沒有按時獲得按摩。我該如何等待?如何在android

pushToken = firebaseIDService.getToken(); 
//SOME CODE 
registerUser(pushToken); 

所以,我只是想停止功能,直到我得到了爲gettoken的結果()。

謝謝。

+0

你是什麼意思你沒有準時得到令牌? – tyczj

+0

既然是一個異步任務,getToken將會啓動,但函數的其餘部分會繼續。所以,在getToken返回任何東西之前調用registerUser()。 –

+0

所以然後把註冊用戶放在你的異步任務的onPostExecute – tyczj

回答

0

該令牌是異步生成的,可以定期刷新。爲了確保您的應用程序採用了最新的令牌,實現FirebaseInstanceIdService .onTokenRefresh如圖所示,文檔在monitoring token generation

每當產生一個新的令牌,所以調用它的上下文getToken確保您正在訪問當前的onTokenRefreshcallback火災,可用註冊令牌。請確保您已經添加服務到您的清單,然後調用getTokenonTokenRefresh的背景下,並記錄值,如圖:

@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

+0

我怎樣才能用回調來實現它? –

+0

'onTokenRefresh' **是一個回調 –

+0

是的,據我所知,但我無法從該方法訪問其他類(我有registerUser)。在這個類中,我可以創建一個firebaseIDService實例(這就是我在做的)來調用getToken。我怎麼能打電話給其他班?我很抱歉,如果我對此慢一點。 –

0

警告!不要在主線上使用它! 此外,這是一個不好的做法(可能),更好地使用@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; 
}