簡體   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