Firebaseでグループチャットのようなものを設定したいと思います。 グループIDが正しい場合は、参加できます。Firebase setValueの完了を聞く方法
問題はFirebaseの参照が常に存在することです。それらは動的に作成されます。参加プロセスで何らかのエラーチェックを許可するには、新しいデータベースエントリを作成したユーザーをユーザーのテーブルに追加します。これが行われた後
public void createParty() {
// you need to be signed in to create a party
assertState(DBState.SignedIn);
// create a new party
ourPartyDatabaseReference = partiesDatabaseReference.push();
usersDatabaseReference = ourPartyDatabaseReference.child("users");
// write our user to the table of users, now the ourPartyReference actually exists
// and if you look for existing users, you will always find at least the original creator
Task initTask = usersDatabaseReference.child(user.getUid()).setValue(true);
は、私はいくつかの参照を設定し、DBState.Connected
へのデータベース接続の状態を変更するためのヘルパーメソッドconnectToParty
を呼び出します。今、あなたはパーティーの鍵を受け取り、それを他のユーザーに送信することができます。キーで、私はfirebaseの名前を意味します。
問題は次のとおりです。他のユーザーは、接続に有効なキーを使用したかどうかを確認する必要があります。彼らは、key/users
の下にデータがあるかどうかをチェックすることによってこれを行います。パーティは、最初のユーザーがデータベースに正常に書き込まれた場合にのみ有効です。
書き込みプロセスが非常に長くかかることがあります。時には完全に失敗するようです。だから私はリスナーを設定しました:
Task initTask = usersDatabaseReference.child(user.getUid()).setValue(true);
initTask.addOnSuccessListener(new OnSuccessListener() {
@Override
public void onSuccess(Object o) {
connectToParty();
}
});
initTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
changeState(DBState.SignedIn, DBTransition.Failure);
}
});
これはテストによってカバーされています。テストは接続を確立し、ログインしてパーティを作成します。パーティが特定のタイムアウト時間内に作成された場合、テストは合格になります。
9回のうち9回は問題なく動作します。 しかし、テストが失敗することがあります。
これは、タイムアウトが短くなることとは関係ありません。タスクからのコールバックは単に呼び出されません。 このコールバックは、接続がオンラインの場合にのみ機能することを読んでいます。
私は自分のコードにタスクの直前にfirebaseDatabase.goOnline();
を追加しました。しかし、それは役に立たない。
私はLAN経由でインターネットに接続しています。他のすべてのテストは合格し、ファイアベースにもアクセスする必要があります。たとえば、サインインプロセスです。
データベースに値を書き込み、書き込みが完了するのを待つ正しい方法は何ですか? offical documentationとして
? –
タイムアウトです。私はコールバックのために10秒待っています、そして、テストは失敗します。 – lhk
この2つのどちらも呼び出されない – lhk