了解事件处理程序完成后如何做某事,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) {}
});
};
您还可以查看 Future
s,它们是 Java class,用于处理异步加载情况,例如这种情况。它们是 Java 相当于 JavaScript Promise,这些承诺如今得到了广泛使用。
我是 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) {}
});
};
您还可以查看 Future
s,它们是 Java class,用于处理异步加载情况,例如这种情况。它们是 Java 相当于 JavaScript Promise,这些承诺如今得到了广泛使用。