如何在代码中的确切位置将数据从火库提取到Android工作室?

有没有办法从代码所在的火库中提取数据?我目前有 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);

    }

cCE快照为空,因为意向在值事件接收器之前运行。


30秒到达战场
浏览 64回答 2
2回答

慕桂英4014372

是异步的,因此使用检索到的数据的唯一方法是 inside ,例如:onDataChange()onDataChange()databaseReference.addValueEventListener(new ValueEventListener() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void onDataChange(@NonNull DataSnapshot dataSnapshot) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cCESnapshot = dataSnapshot.child(uid).child("currChallenges").child(challengeList.get(position));&nbsp; &nbsp; Intent intent = new Intent();&nbsp; &nbsp; intent.setClass(this, ChallengeView.class);&nbsp; &nbsp; intent.putExtra("snapshot", cCESnapshot.toString());&nbsp; &nbsp; intent.putExtra("name", challengeList.get(position));&nbsp; &nbsp; startActivity(intent);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void onCancelled(@NonNull DatabaseError databaseError) {&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; });

郎朗坤

这是一个异步操作,当数据到达时,将触发回调。您的代码将按顺序执行,这就是为什么您在 中未获得任何值的原因。onDataChangestartActivtycCESnapshot在侦听器内移动代码。startActivity但要小心,因为每次调用点击侦听器时,您都会添加一个 value 事件侦听器。这样,您每次单击都会有多个调用,因此多个 .onItemClickonDataChangestartActivities相反,我建议使用仅在数据发生一次更改后才会触发的。addListenerForSingleValueEvent
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java