Android:如何在类级别数组列表中循环访问Firebase Datasnapshot并存储密钥?

时间:2016-12-27 18:56:14

标签: android arrays loops firebase firebase-realtime-database

我是Java的新手,所以如果这是非常直接的话,请提前道歉。

我想在我的Firebase数据库中循环并将每个子项的密钥集存储在ArrayList中。

以下是代码的简短版本:

public class MainActivity extends AppCompatActivity {

private DatabaseReference mRefEvents;
private List<String> newArray;


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

    mRefEvents = FirebaseDatabase.getInstance().getReferenceFromUrl("https:***");
    newArray = new ArrayList<String>();


    mRefEvents.addValueEventListener(new ValueEventListener()
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            for (DataSnapshot child : dataSnapshot.getChildren())
            {
                for (DataSnapshot grandChild : child.getChildren())
                {
                    newArray.add(grandChild.getKey());
                }
            }
            Log.i("App info middle", newArray.toString());
        }

        @Override
        public void onCancelled(DatabaseError databaseError)
        {
        }
    });

    Log.i("App info end", newArray.toString());
}
}

当我在addValueEventListener方法中记录(“App info middle”)newArray时,我得到了我需要的值。但是,底部的第二个日志(“App info end”)给了我一个空数组,并没有将键存储到ArrayList newArray中。

我确信我错过了一些简单的东西,但任何建议都会受到高度赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

这看起来像是你一次性运行所有东西。由于监听器以异步方式运行,我想你正在点击底部的日志&#34; App Info End&#34;在您登录收听者&#34; App Info Middle&#34;之前。尝试运行&#34;应用信息结束&#34;在不同的方法或单击按钮后,您应该看到填充的数组。说完这一切之后,您可以将输出发布到控制台,这样我们就可以确认App Info End在App Info Middle之前被点击了吗?