Rumah >Java >javaTutorial >Bagaimana untuk Mengembalikan Nilai Tangkapan Data Pangkalan Data Masa Nyata Firebase daripada Kaedah Asynchronous?

Bagaimana untuk Mengembalikan Nilai Tangkapan Data Pangkalan Data Masa Nyata Firebase daripada Kaedah Asynchronous?

Susan Sarandon
Susan Sarandonasal
2025-01-03 09:43:40555semak imbas

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

Mengembalikan Nilai DataSnapshot daripada Kaedah

Apabila bekerja dengan Pangkalan Data Masa Nyata Firebase, adalah perkara biasa untuk mendapatkan data secara tidak segerak menggunakan kaedah addListenerForSingleValueEvent(). Walau bagaimanapun, ini memberikan cabaran apabila cuba mengembalikan nilai yang diperoleh hasil daripada kaedah panggilan.

Memahami Sifat Asynchronous

Sifat tak segerak bagi Pangkalan Data Masa Nyata Firebase membayangkan data itu mungkin tidak tersedia serta-merta selepas memanggil addListenerForSingleValueEvent(). Sebaliknya, kaedah onDataChange() dipanggil apabila data telah dimuatkan.

Isu Asynchronous Klasik

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) {}
    });
}

Dalam kod di atas, kaedah getValue() dipanggil sebelum kaedah onDataChange() digunakan. Ini akan menyebabkan nilai nol dikembalikan kerana data belum tersedia.

Pendekatan Alternatif

Gunakan Panggilan Balik:

Buat antara muka panggil balik tersuai untuk mengendalikan data apabila ia tersedia.

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) {}
    });
}

Dalam kaedah panggilan, hantar contoh antara muka panggil balik untuk menerima data.

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

Gunakan Masa Depan:

Gunakan Masa Depan untuk mewakili hasil akhirnya operasi tak segerak.

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;
}

Dalam kaedah panggilan, gunakan panggilan menyekat untuk menunggu keputusan atau daftar panggilan balik untuk akhirnya selesai.

Kesimpulan

Mengembalikan nilai DataSnapshot daripada kaedah memerlukan pemahaman tentang sifat tak segerak operasi. Dengan menggunakan panggilan balik atau Masa Depan, pembangun boleh mengendalikan nilai pulangan sebaik sahaja ia tersedia, mempromosikan kebolehselenggaraan dan ketepatan kod.

Atas ialah kandungan terperinci Bagaimana untuk Mengembalikan Nilai Tangkapan Data Pangkalan Data Masa Nyata Firebase daripada Kaedah Asynchronous?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn