主线程不会等待事件或回调触发

时间:2016-05-23 17:32:27

标签: java firebase firebase-realtime-database

我正在尝试建立与firebase的基本连接并从firebase db获取一些数据,但在触发回调之前,我的主线程退出上下文并且我没有获得任何数据作为回报。以下是我的代码:

public class UserStore {
    private Firebase rootRef_; 
    private UserDetails userDetails;

    public UserStore() {
         rootRef_ = new Firebase("https://<FIREBASE-APP>.firebaseio.com/");
    }

    public UserDetails getUserDetails(String mailId) {
        mailId = mailId.toLowerCase().replace(".", ",");
        rootRef_.child("users/" + mailId).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot != null) {
                    System.out.println("user data snapshot: " + dataSnapshot.toString());
                    UserStore.this.userDetails = dataSnapshot.getValue(UserDetails.class);
                } else {
                    System.out.println("data snapshot is null!!");
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });
        return userDetails;
    }
 }

我收到了对查询的正确回复,但这需要时间。我尝试在这种方法中使用sleep。它工作正常,但它不会是实时。

无论如何,我可以获得实时响应吗?

1 个答案:

答案 0 :(得分:0)

您在回调完成之前返回UserDetail。 这实际上是关于异步代码组织而不是Firebase。

public void getUserDetails(String mailId) {
        mailId = mailId.toLowerCase().replace(".", ",");
        rootRef_.child("users/" + mailId).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot != null) {
                    System.out.println("user data snapshot: " + dataSnapshot.toString());
                    UserDetail userDetails = dataSnapshot.getValue(UserDetails.class);
                    //DO SOMETHING WITH USER DETAILS HERE!
                } else {
                    System.out.println("data snapshot is null!!");
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });
        //DONT RETURN USER DETAILS HERE
    }

有关详细信息,请查看AsyncTaskRxJava with Android