ホームページ >Java >&#&チュートリアル >非同期メソッドから Firebase Realtime Database DataSnapshot 値を返す方法

非同期メソッドから Firebase Realtime Database DataSnapshot 値を返す方法

Susan Sarandon
Susan Sarandonオリジナル
2025-01-03 09:43:40555ブラウズ

How to Return a Firebase Realtime Database DataSnapshot Value from an Asynchronous Method?

メソッドから DataSnapshot 値を返す

Firebase Realtime Database を使用する場合、addListenerForSingleValueEvent() メソッドを使用してデータを非同期的に取得するのが一般的です。ただし、メソッドの呼び出しの結果として取得された値を返そうとする場合、これには課題が生じます。

非同期の性質を理解する

Firebase Realtime Database の非同期の性質は、次のことを意味します。 addListenerForSingleValueEvent() を呼び出した直後には、そのデータが利用できない可能性があります。代わりに、データがロードされたときに onDataChange() メソッドが呼び出されます。

古典的な非同期の問題

private String getUserName(String uid) {
    databaseReference.child(String.format("users/%s/name", uid))
            .addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // How to return this value?
            dataSnapshot.getValue(String.class);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
}

上記のコードでは、getValue() メソッドがonDataChange() メソッドが呼び出される前に呼び出されます。データがまだ利用できないため、結果として null 値が返されます。

代替アプローチ

コールバックを使用する:

データが次の場合に処理するカスタム コールバック インターフェイスを作成する

public interface MyCallback {
    void onCallback(String value);
}

public void readData(MyCallback myCallback) {
    databaseReference.child(String.format("users/%s/name", uid)).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String value = dataSnapshot.getValue(String.class);
            myCallback.onCallback(value);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
}

呼び出しメソッドで、データを受信するコールバック インターフェイスのインスタンスを渡します。

readData(new MyCallback() {
    @Override
    public void onCallback(String value) {
        // Use the returned value here
    }
});

Use Future:

Future を使用して非同期の最終的な結果を表現します操作。

public Future<String> readData() {
    final Future<String> future = new CompletableFuture<>();
    databaseReference.child(String.format("users/%s/name", uid)).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            future.complete(dataSnapshot.getValue(String.class));
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
    return future;
}

呼び出しメソッドでは、ブロッキング呼び出しを使用して結果を待つか、最終的に完了するためにコールバックを登録します。

結論

メソッドから DataSnapshot 値を返すには、操作の非同期の性質を理解する必要があります。コールバックまたは Future を利用することで、開発者は戻り値が使用可能になったときにそれを処理できるため、コードの保守性と正確性が促進されます。

以上が非同期メソッドから Firebase Realtime Database DataSnapshot 値を返す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。