私はファイヤーベースの通知を使用しています。私が時間にプッシュトークを取得しない場合、いくつかの時間があります。どうすればそれを待つことができますか?アンドロイドでファイヤーベースのプッシュトークンを待つ方法
pushToken = firebaseIDService.getToken();
//SOME CODE
registerUser(pushToken);
私はgetToken()の結果を得るまで、その機能を停止したいだけです。
ありがとうございました。
私はファイヤーベースの通知を使用しています。私が時間にプッシュトークを取得しない場合、いくつかの時間があります。どうすればそれを待つことができますか?アンドロイドでファイヤーベースのプッシュトークンを待つ方法
pushToken = firebaseIDService.getToken();
//SOME CODE
registerUser(pushToken);
私はgetToken()の結果を得るまで、その機能を停止したいだけです。
ありがとうございました。
トークンは非同期で生成され、定期的にリフレッシュされます。 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
に相当する可能性があります
どうすればコールバックで実装できますか? –
'onTokenRefresh' **は**コールバックです –
はい、私は理解していますが、そのメソッドから他のクラス(registerUserを持っている)にアクセスすることはできません。このクラスでは、getTokenを呼び出すために、firebaseIDService(私がやっていることです)のインスタンスを作成できます。どのように私は他のクラスに電話することができますか?私はこれについて少し遅い場合は申し訳ありません。 –
警告!メインスレッドで使用しないでください! また、(おそらく)悪い習慣で、@ 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;
}
あなたは、トークンを適時に受け取っていないということを意味しますか? – tyczj
非同期タスクなので、getTokenは起動しますが、残りの関数は続行されます。したがって、registerUser()はgetTokenが何かを返す前に呼び出されます。 –
だから、非同期タスクのonPostExecuteに登録ユーザを入れてください。 – tyczj