从valueEventListener java返回值

时间:2017-02-09 05:27:46

标签: android firebase firebase-realtime-database

我试图返回一个布尔值,但返回的值总是false,即在这种情况下为0。

check变量是一个实例变量,按下按钮时会调用下面的函数。

private boolean checkAnswerSubmission() {

    DatabaseReference answerDatabase = FirebaseDatabase.getInstance().getReference().child("userPuzzleHistory").child(uid);
    answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.hasChild(String.valueOf(imagename))) {
                check = 1;
            } else {
                check = 0;
            }
     //here the value check is working fine but the value cannot be returned from here.
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    //here the value returned is always 0
    if (check == 1)
        return true;
    else
        return false;

}

2 个答案:

答案 0 :(得分:5)

与所有异步操作一样,我经常以回调方式执行此操作。

您的解决方案可以像这样工作:

  1. 创建一个简单的回调界面(我在几乎每个应用程序中使用的库中都有我的)

    public interface SimpleCallback {
        void callback(Object data);
    }
    
    // You could do it as well generic, that's what I do in my lib:
    public interface SimpleCallback<T> {
        void callback(T data);
    }
    
  2. 然后重新设计你方法的签名:

    private void checkAnswerSubmission(@NonNull SimpleCallback<boolean> finishedCallback) {
    
        DatabaseReference answerDatabase = FirebaseDatabase.getInstance().getReference().child("userPuzzleHistory").child(uid);
        answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // This will simple call your callback containing a boolean true/false
                finishedCallback.callback(dataSnapshot.hasChild(String.valueOf(imagename)));
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
    }
    

    您可以这样称呼:

    checkAnswerSubmission(new SimpleCallback<boolean>() {
       @Override
       void callback(boolean data) {
           if (data) {
              // true was returned
           } else {
              // false was returned
           }
       }
    });
    

答案 1 :(得分:2)

数据库引用未在运行函数的同一线程上完成。它只是为异步调用添加了一个侦听器,该侦听器仅在从服务器接收数据时才会生成。

所以你的程序初始化一个监听器并转到这一行的下一个语句。

answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.hasChild(String.valueOf(imagename))) {
                check = 1;
            } else {
                check = 0;
            }
     //here the value check is working fine but the value cannot be returned from here.
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

现在由于程序没有等待从它执行的服务器收到响应:

if (check == 1)
        return true;
    else
        return false;

因此,如果您的检查值已初始化,则很可能将0作为值并始终返回false。