这是我的代码:

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侦听器时,发生的情况是您的电话启动了一项服务,该服务可以连接到Internet,并在获得电话后返回结果。
当您的手机连接到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()函数之外,声明一个新函数,如下所示:

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


希望我可以理解!
如果有什么不清楚的地方,可以这样说:)

10-01 19:57