我是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中。
我确信我错过了一些简单的东西,但任何建议都会受到高度赞赏。谢谢!
答案 0 :(得分:0)
这看起来像是你一次性运行所有东西。由于监听器以异步方式运行,我想你正在点击底部的日志&#34; App Info End&#34;在您登录收听者&#34; App Info Middle&#34;之前。尝试运行&#34;应用信息结束&#34;在不同的方法或单击按钮后,您应该看到填充的数组。说完这一切之后,您可以将输出发布到控制台,这样我们就可以确认App Info End在App Info Middle之前被点击了吗?