了解事件处理程序完成后如何做某事,Android,Firebase

Understanding how to do something when an event handler has finished, Android, Firebase

我是 Android/Java/Firebase 的新手,所以这里可能走错了路,请随时指导我...

我试图简单地了解如何在"do something" 事件处理程序完成其工作后....

具体来说,我正在尝试 "cleanly" 封装 firebase 对象管理。我有一个包含用户数据的本地对象(在此示例中为用户)。用户数据的子集(子类)存储在 Firebase 上。也就是说,用户对象数据的余额仅存储在本地,因为我可以在运行时计算它,否则不合理或不需要将该数据存储在 Firebase 上。 (这个细节我觉得和实际问题无关)

子类 (UserFireBase) 的设计使其可以使用 JSON Serialiser 中的 buit 在一行中直接读取 to/from Firebase。示例如下:

public Class User{
  String UserID
  Image userPhoto; //example of locally held User data
  Boolean dataReadComplete=false;//a very poor locking device
  public Class UserFirebase {//User Data stored on a Firebase Node
    String UserName
    String UserWebsiteURL
  } 

public void writeUserDatatoFB(){ 
  refUserTree = new Firebase(FIREBASE_URL + "Users");
  refUserTree.child(UserID).setValue(UserFirebase);//this works just fine
}



public void readUserDataFromFB(){
  refUserTree = new Firebase(FIREBASE_URL + "Users");
  dataReadComplete=false;
  refUserTree.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
      UserFirebase = dataSnapshot.getValue(UserFirebase.class);
      dataReadComplete=true;
    }
  @Override
  public void onCancelled(FirebaseError firebaseError) {}});

所以这确实有效,从主要activity我可以有效地去:

user.readUserDataFromFB();

//wait until dataReadComplete=true, then do some stuff

user.writeDataToFB();

但这似乎是错误的,而且设计丑陋。即在一次性事件处理程序完成后执行代码的最佳实践是什么?例如,在其他语言中,我可能能够将方法作为参数传递给 WriteUserData 函数,这样当它完成时,它会调用我需要执行的下一段代码...

我目前唯一能想到的其他解决方案是将 WriteUserData 代码移到我的主 activity 中,这看起来也有点丑陋,没有封装。

我的总体设计在这里完全错误吗?我对事件驱动编程一点都不熟悉。

(谢谢)

Java 也支持回调。事实上,您传入的 ValueEventListener 是一种回调形式。所以如果你想在数据加载完成后执行写操作:

user.readUserDataFromFirebase(new Runnable() {
    public void run() {
        user.writeDataToFirebase();
    }
});

public void readUserDataFromFirebase(Runnable onLoaded){
    refUserTree = new Firebase(FIREBASE_URL + "Users");
    refUserTree.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            UserFirebase = dataSnapshot.getValue(UserFirebase.class);
            onLoaded.run();
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {}
    });
};

这种方式感觉很不面向对象,所以我只是将它们设为静态函数并传递给用户:

readUserDataFromFirebase(new UnaryOperator<UserFirebase>() {
    public UserFirebase apply(UserFirebase user) {
        user.writeDataToFirebase();
    }
});

public static void readUserDataFromFirebase(String userID, UnaryOperator<UserFirebase> onLoaded){
    refUserTree = new Firebase(FIREBASE_URL + "Users");
    refUserTree.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            UserFirebase user = dataSnapshot.getValue(UserFirebase.class);
            onLoaded.apply(user);
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {}
    });
};

您还可以查看 Futures,它们是 Java class,用于处理异步加载情况,例如这种情况。它们是 Java 相当于 JavaScript Promise,这些承诺如今得到了广泛使用。