首頁 >Java >java教程 >如何從非同步方法返回 Firebase 即時資料庫 DataSnapshot 值?

如何從非同步方法返回 Firebase 即時資料庫 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 即時資料庫時,通常會使用 addListenerForSingleValueEvent() 方法非同步擷取資料。但是,當嘗試透過呼叫方法返回檢索到的值時,這會帶來挑戰。

了解非同步性質

Firebase 即時資料庫的非同步性質意味著呼叫 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() 方法之前呼叫。這將導致返回空值,因為資料尚不可用。

替代方法

使用回調:

建立自訂回呼接口,用於在資料變為時處理資料

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

使用 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 即時資料庫 DataSnapshot 值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn