java - onDataChange 永远不会执行

标签 java android firebase firebase-realtime-database

这是我的代码:

public ArrayList<Integer> getArray() {

    final FirebaseDatabase database = FirebaseDatabase.getInstance();

    final DatabaseReference myReff =database.getReference("server").child("user");


    myReff.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            boolean connected = dataSnapshot.getValue(Boolean.class);
            if (connected){
                Log.d("CONNECT","YES");
            }
            else {
                Log.d("CONNECT","NO");

            }

            GenericTypeIndicator<ArrayList<Integer>> genericTypeIndicator = new GenericTypeIndicator<ArrayList<Integer>>() {};
            array = dataSnapshot.getValue(genericTypeIndicator) ;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


    return array;
}

这是我的数据库:

 "server" : {
  "user" : {
         1 : 0,
         2 : 0,
         3 : 0
 },
}

这段代码的目的是在我的数据库中检索一个数组。

问题是 OnDataChange 从未在这个函数中被调用

(我调试了我的代码,在其中放置了断点,但什么也没发生。并且 CONNECT 未显示在 Logcat 中)。

我不明白为什么,因为在添加监听器的时候,即使数据没有变化,ondatachange也必须至少触发一次。

你能解释一下为什么 OnDataChange 没有被执行吗?

最佳答案

当您添加 ListenerForSingleValueEvent 时或任何其他 Firebase 监听器,发生的情况是您的手机启动连接到互联网的服务并在他获得结果后返回结果。 当您的手机连接到 firebase 服务器并返回数据时,您的函数 ( public ArrayList<Integer> getArray() ) 已经完成。该函数不会等待数据返回,它会继续。

最终,当您的数据从 Firebase 数据库返回时,它会调用函数 public void onDataChange(DataSnapshot dataSnapshot)或到 function public void onCancelled(DatabaseError databaseError)您已在 new ValueEventListener(){} 中声明

所以,在你的情况下,如果你想返回数组,你需要从 onDataChange(DataSnapshot dataSnapshot) 调用另一个函数函数并将数组作为参数传递。

例如:

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        boolean connected = dataSnapshot.getValue(Boolean.class);
        if (connected){
            Log.d("CONNECT","YES");
        }
        else {
            Log.d("CONNECT","NO");

        }

        GenericTypeIndicator<ArrayList<Integer>> genericTypeIndicator = new GenericTypeIndicator<ArrayList<Integer>>() {};
        array = dataSnapshot.getValue(genericTypeIndicator);

        handleArrayFunction(array);
    }

在你的public ArrayList<Integer> getArray()之外function 像这样声明一个新函数:

    private void handleArrayFunction(ArrayList<Integer> array){ 
        //use your array for what you want
    }

希望我是可以理解的! 如果有什么不够清楚,请随意说:)

关于java - onDataChange 永远不会执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48673789/

相关文章:

java - 使用 Java Swing 组件的 Z 顺序

java - 等待通知实现的问题

android - 屏幕锁定时 Activity 返回纵向

java - 为什么条目在 Firebase 数据库中不断循环?

javascript - 在 firebase 查询中使用 Promise 或 Await

java - 分布式系统中的警报/消息转发

java - 从 MenuItem 进行黑莓屏幕导航

java - 简单 ViewPager - 单一布局

android - 如何在 ActionBar 中引入 Swipeable Tabs?

从 APN 迁移到 firebase 后未重新生成 iOS 设备 token