2017-09-02 58 views
-1

我正在爲使用Firebase的android製作應用程序。我所試圖做的是,每一個節點都有一個級別號:如何在Firebase中處理Android的異步運行

User--- 
     | 
     ---> Jamse--- 
     |   | 
     |   ---> Level = 0 
     ---> Taylor--- 
        | 
        ----> Level = 1 

我希望每個節點遍歷和存儲在ArrayList中的級別數量。但問題是,我的ArrayList填充了關卡號,只能在firebaseListener函數內部存在。在函數之外,ArrayList是空的。任何人都可以給我一個關於如何解決這個問題的建議嗎?

代碼:

private ArrayList<Integer> parentLevel; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_linked_people_tree); 

     LinearLayout linked = (LinearLayout) findViewById(R.id.linkedlayoutid); 

     mFirebaseAuth = FirebaseAuth.getInstance(); 
     users = mFirebaseAuth.getCurrentUser(); 
     mDatabaseReference = FirebaseDatabase.getInstance().getReference(); 

     parentLevel = new ArrayList<Integer>(); 

     mDatabaseReference.child("Users").child(users.getUid()).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if(dataSnapshot.child("OriginalUser").child("Parents").hasChildren()) { 
        DataSnapshot parentSnapshot = dataSnapshot; 

        int level = 0; 
        relatedParentNodeFinder(parentSnapshot, users.getUid(), level); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 

是查找最高級別的功能:

void relatedParentNodeFinder(DataSnapshot parentSnapshot, String userID, int level) { 

     if(userID.equals(users.getUid())) { 
      if (parentSnapshot.child("OriginalUser").child("Parents").exists()) { 

       mDatabaseReference.child("Users").child(users.getUid()).child("OriginalUser").child("Level").setValue(level); 

       level++; 
       for (DataSnapshot postSnapshot : parentSnapshot.child("OriginalUser").child("Parents").getChildren()) { 
        relatedParentNodeFinder(parentSnapshot, postSnapshot.getValue().toString(), level); 
       } 
      } 
     } else if(parentSnapshot.child("FamilyMembers").child(userID).child("Parents").exists()) { 
      if(parentSnapshot.child("FamilyMembers"). child(userID).child("Parents").exists()) { 

       mDatabaseReference.child("Users").child(users.getUid()).child("FamilyMembers") 
         .child(userID).child("Level").setValue(level); 

       level++; 
       for(DataSnapshot postSnapshot : parentSnapshot.child("FamilyMembers").child(userID).child("Parents").getChildren()) { 
        relatedParentNodeFinder(parentSnapshot, postSnapshot.getValue().toString(), level); 
       } 
      } 
     } else {  //Has the Key of the Top Parent Nodes 
      mDatabaseReference.child("Users").child(users.getUid()).child("FamilyMembers") 
        .child(userID).child("Level").setValue(level); 

//------> parentLevel.add(level);  //THIS IS THE ARRAYLIST. I CANT MAKE IT WORK OUTSIDE OF THE LISTENER 

      topDownChildNodeFinder(parentSnapshot, userID, level); 
     } 
    } 
+0

你爲什麼試圖在回調之外使用Arraylist?您的Arraylist絕對可以存在於聽衆之外。請添加您的代碼 –

+0

我添加了代碼 –

+0

parentLevel.add(level);將等級號碼添加到數組列表中,但是當我試圖在主數據庫中的Firebase偵聽器之後訪問它時,它會將其顯示爲一個數組列表 –

回答

1

你必須等待火力地堡運行

// clear onDataChange 
    parentLevel.clear(); 
    int level = 0; 
    // populate the list 
    relatedParentNodeFinder(parentSnapshot, users.getUid(), level); 
    // Use the list here. Shouldn't be empty 
} 

注意level將爲零後節點查找器方法

+1

哦,我明白你在說什麼。我將不得不繼續在onDataChange中使用arrayList,只有 –

+0

是的,它的確如此。我想我將不得不將它保存在onDataChange中。謝謝! –

+0

您可以使用對象引用作爲字段,但您只需要初始化回調中的數據,然後等待它被填充 –