【问题标题】:How to deal with the Asynchronous run of Android in FirebaseFirebase中如何处理Android的异步运行
【发布时间】:2017-09-02 00:31:03
【问题描述】:

我正在使用 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) {

            }
        });
    }

【问题讨论】:

  • 你为什么要在回调之外使用 Arraylist?您的 Arraylist 绝对可以存在于侦听器之外。请添加您的代码
  • 我添加了代码
  • parentLevel.add(level);将级别编号添加到数组列表中,但是当我尝试在主要的 firebase 侦听器之后访问它时,它会将其显示为 emoty 数组
  • 您实际在哪里使用该列表?
  • 我更新代码,可以看到箭头

标签: java android firebase arraylist


【解决方案1】:

您必须等待 Firebase 运行

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

注意level在节点查找方法之后会为零

【讨论】:

  • 哦,我明白你在说什么。我将不得不继续使用 onDataChange 内的 arrayList
  • 是的,确实如此。我想我必须将它保存在 onDataChange 中。谢谢!
  • 您可以使用对象引用作为字段,但您只需在回调中初始化数据,然后等待它被填充
猜你喜欢
  • 2022-12-03
  • 2015-07-28
  • 2018-03-15
  • 2023-03-06
  • 2018-12-12
  • 1970-01-01
  • 2021-05-28
  • 2017-11-20
  • 2010-12-27
相关资源
最近更新 更多