2015-08-15 16 views
0

我对Android/Java/Firebase相当陌生,因此可能在此处出现错误的轨道,请随时引导我进入任何方向......了解如何在事件处理程序完成时执行某些操作Android,Firebase

我想简单地理解如何“做什么” 事件处理程序已经完成了它的工作....

具体来说,我想“干净” enscapulate火力对象管理。我有一个包含用户数据的本地对象(用户,本例)。用户数据的子集(子类)存储在Firebase上。也就是说,用户对象数据的平衡仅在本地存储,因为我可以将其计算为运行时,否则将这些数据存储在Firebase上是不合理或不必要的。 (我认为这个细节与实际问题无关)

子类(UserFireBase)被设计为可以使用JSON串行器中的buit在一行中直接从Firebase读取/从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(); 

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

我现在唯一能想到的其他解决方案是将WriteUserData代码移到我的主要活动中,这看起来也很丑陋,没有封装。

我的一般设计在这里完全错了吗?我对事件驱动编程并不熟悉。

(谢谢)

回答

2

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) {} 
    }); 
}; 

感觉还非OO这样,所以我只是让他们静态函数并通过用户:

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类,如此类。它们是Java相当于现在得到很多使用的JavaScript Promise。

+0

谢谢弗兰克,它的魅力! –

相关问题