从valueEventListener java返回值

Sar*_*wal 1 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;

}
Run Code Online (Sandbox Code Playgroud)

Gri*_*ram 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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

然后重新设计方法的签名,如下所示:

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) {

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

你这称之为:

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