android - 等待 Firebase 异步在 Android 中检索数据

标签 android firebase asynchronous firebase-realtime-database synchronization

我需要自己存储异步的 FireBase getValue 方法的结果。我不能使用诸如“onPostExecute()”之类的东西,并且为了我的目的,我不能将我的所有操作执行到“onDataChange()”,因为我需要在未来的其他 Activity 中引用一些内容。

这是我检索数据的代码 fragment :

    List<Village> villages = new LinkedList<>();
    Firebase ref = new Firebase("MYFIREBASEURL").child("village");
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            spinnerArray.clear();
            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                Village v = postSnapshot.getValue(Village.class);
                villages.add(v);
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });

如果我尝试从“onDataChange”中读取村庄,自然对于他的异步生活,我有 null 值。有一种方法可以确保调用 onDataChange 吗?

最佳答案

您可以定义一个监听器接口(interface)来处理它。 示例:

 public interface OnGetDataListener {
    public void onStart();
    public void onSuccess(DataSnapshot data);
    public void onFailed(DatabaseError databaseError);
}

然后我创建了一个自定义函数来获取 Database.class 中的数据:

  public void mReadDataOnce(String child, final OnGetDataListener listener) {
    listener.onStart();
   FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            listener.onSuccess(dataSnapshot);
        }

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

当我想从 Main.class 获取数据时,我会这样做:

private void mCheckInforInServer(String child) {
    new Database().mReadDataOnce(child, new OnGetDataListener() {
        @Override
        public void onStart() {
            //DO SOME THING WHEN START GET DATA HERE
        }

        @Override
        public void onSuccess(DataSnapshot data) {
           //DO SOME THING WHEN GET DATA SUCCESS HERE
        }

        @Override
        public void onFailed(DatabaseError databaseError) {
           //DO SOME THING WHEN GET DATA FAILED HERE
        }
    });

}

通过这种方式,您可以重用您的方法并处理数据。

关于android - 等待 Firebase 异步在 Android 中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33723139/

相关文章:

firebase - 无法导入 Firebase 项目

java - HttpAsyncClients.custom 上的线程 "main"java.lang.NoClassDefFoundError 中出现异常

javascript - 带有嵌套 For 循环的进度条

android - 表达式不能是 Kotlin 中的选择器(出现在点之后)

Android Assets 时间戳

android - 有效地汇总 firebase 数据

c# - 使用 "return"终止或退出 C# 异步方法

java - POST 请求正在调用 doGet 方法

android - 开发服务器返回响应错误代码 500 - react native - ./configs/main

android - 最高的 firebase 版本代码也用于编译播放服务库