2015-08-15 42 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

謝謝弗蘭克,它的魅力! –

相關問題