繁体   English   中英

如何在代码中的确切位置将数据从 firebase 提取到 android studio?

[英]How do I pull data from firebase into android studio at the exact point in the code?

有没有办法从代码所在的firebase中提取数据? 我目前有 valueEventListeners,但它们都在它们下面的代码之后运行,从而使以下代码无效。 我希望能够在代码所在的位置提取一个值,而不是稍后。

到目前为止,我还没有在网上找到任何关于此的信息。

我在代码中遇到的问题的一个很好的例子:

public void onItemClick(AdapterView<?> l, View v, final int position, long id) {

        FirebaseAuth mAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mAuth.getCurrentUser();
        final String uid = user.getUid();

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                cCESnapshot = dataSnapshot.child(uid).child("currChallenges").child(challengeList.get(position));
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        Intent intent = new Intent();
        intent.setClass(this, ChallengeView.class);
        intent.putExtra("snapshot", cCESnapshot.toString());
        intent.putExtra("name", challengeList.get(position));
        startActivity(intent);
    }

cCESnapshot 为空,因为意图在 valueEventListener 之前运行。

onDataChange()是异步的,因此使用检索到的数据的唯一方法是在onDataChange() ,例如:

databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            cCESnapshot = dataSnapshot.child(uid).child("currChallenges").child(challengeList.get(position));

    Intent intent = new Intent();
    intent.setClass(this, ChallengeView.class);
    intent.putExtra("snapshot", cCESnapshot.toString());
    intent.putExtra("name", challengeList.get(position));
    startActivity(intent);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

这是一个异步操作,当数据到达时,将触发onDataChange回调。 您的startActivty代码将按顺序执行,这就是您在cCESnapshot没有任何价值的cCESnapshot

在侦听器内移动startActivity代码。

但是要小心,因为每次调用onItemClick单击侦听器时,都会添加一个值事件侦听器。 这样,您将在每次单击中多次调用onDataChange以及多个startActivities

相反,我建议使用addListenerForSingleValueEvent ,它只会在数据发生一次更改后触发。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM