Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 了解事件处理程序完成后如何执行操作,Android、Firebase_Java_Android_Firebase - Fatal编程技术网

Java 了解事件处理程序完成后如何执行操作,Android、Firebase

Java 了解事件处理程序完成后如何执行操作,Android、Firebase,java,android,firebase,Java,Android,Firebase,我对Android/Java/Firebase相当陌生,因此可能在这里走错了方向,请随意引导我走向任何方向 我试图简单地理解在事件处理程序完成其工作后如何“做某事” 具体地说,我正试图“干净地”将firebase对象管理嵌入其中。我有一个包含用户数据的本地对象(例如User)。用户数据的子集(子类)存储在Firebase上。也就是说,用户对象数据的余额只存储在本地,因为我可以在运行时计算它,否则将该数据存储在Firebase上是不合理的或不需要的。(我认为这个细节与实际问题无关) 子类(User

我对Android/Java/Firebase相当陌生,因此可能在这里走错了方向,请随意引导我走向任何方向

我试图简单地理解在事件处理程序完成其工作后如何“做某事”

具体地说,我正试图“干净地”将firebase对象管理嵌入其中。我有一个包含用户数据的本地对象(例如User)。用户数据的子集(子类)存储在Firebase上。也就是说,用户对象数据的余额只存储在本地,因为我可以在运行时计算它,否则将该数据存储在Firebase上是不合理的或不需要的。(我认为这个细节与实际问题无关)

子类(UserFireBase)的设计是为了使用内置JSON Serialiser在一行中直接读取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) {}});
因此,这确实有效,从我可以有效开展的主要活动来看:

user.readUserDataFromFB();

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

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

我目前唯一能想到的另一个解决方案是将WriteUserData代码移动到我的主要活动中,这看起来也有点丑陋,没有封装

我的总体设计完全错了吗?我对事件驱动编程一点也不熟悉


(谢谢)

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) {}
    });
};
readUserDataFromFirebase(新的UnaryOperator(){
公共UserFirebase应用(UserFirebase用户){
user.writeDataofirebase();
}
});
public static void readUserDataFromFirebase(字符串userID,unarymoperator onload){
RefuerTree=新Firebase(Firebase_URL+“用户”);
refuerTree.child(userID).addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
UserFirebase user=dataSnapshot.getValue(UserFirebase.class);
已加载。应用(用户);
}
@凌驾
已取消的公共无效(FirebaseError FirebaseError){}
});
};
您还可以研究s,这是一个Java类,用于处理异步加载情况,例如下面的情况。它们是Java的等价物,相当于JavaScript承诺,这些承诺如今得到了广泛的使用