0

私はファイヤーベースの通知を使用しています。私が時間にプッシュトークを取得しない場合、いくつかの時間があります。どうすればそれを待つことができますか?アンドロイドでファイヤーベースのプッシュトークンを待つ方法

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

私はgetToken()の結果を得るまで、その機能を停止したいだけです。

ありがとうございました。

+0

あなたは、トークンを適時に受け取っていないということを意味しますか? – tyczj

+0

非同期タスクなので、getTokenは起動しますが、残りの関数は続行されます。したがって、registerUser()はgetTokenが何かを返す前に呼び出されます。 –

+0

だから、非同期タスクのonPostExecuteに登録ユーザを入れてください。 – tyczj

答えて

0

トークンは非同期で生成され、定期的にリフレッシュされます。 monitoring token generation上のドキュメントに示すように、あなたのアプリが最新のトークンを使用して確保するために、FirebaseInstanceIdService .onTokenRefreshを実装:

onTokenRefreshcallback火災新しいトークンが生成されるたびに、とてもその文脈で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機能は、あなたが自分で実装したいものです:あなたが onTokenRefreshのコンテキストで getTokenを呼び出し、示されているように、値を記録、その後、あなたのマニフェストにサービスを追加したことを確認してください、あなたのコードの registerUserに相当する可能性があります

+0

どうすればコールバックで実装できますか? –

+0

'onTokenRefresh' **は**コールバックです –

+0

はい、私は理解していますが、そのメソッドから他のクラス(registerUserを持っている)にアクセスすることはできません。このクラスでは、getTokenを呼び出すために、firebaseIDService(私がやっていることです)のインスタンスを作成できます。どのように私は他のクラスに電話することができますか?私はこれについて少し遅い場合は申し訳ありません。 –

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; 
} 
関連する問題