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