2017-09-02 41 views
-1

私はfirebaseでアンドロイド用のアプリを作っています。私は何をしようとしていることは、すべてのノードは、レベル番号を持っているということです。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(レベル); arraylistにレベル番号を追加しますが、メインのfirebase listenerの後にアクセスしようとすると、それはemoty配列として表示されます –

答えて

1

あなたはlevelは後にゼロになることを

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

注意を実行するためにFirebaseを待つ必要がノードファインダメソッド

+1

あなたは何を言っているのか理解しています。私はonDataChange内でarrayListを使用し続ける必要があります –

+0

うん、それはそのように働いた。私はそれをonDataChangeの中に入れなければならないと思います。ありがとう! –

+0

フィールド参照としてオブジェクト参照を使用できますが、コールバック内のデータを初期化し、データが入力されるまで待つ必要があります –

関連する問題