如何在代码中的确切位置将数据从Firebase拉入android studio?

时间:2019-04-09 21:25:50

标签: android firebase firebase-realtime-database

有什么方法可以从代码所在的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为null,因为意图在valueEventListener之前运行。

2 个答案:

答案 0 :(得分:2)

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css" rel="stylesheet"/> <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script> $(document).ready(function(){ var accessToken = "secret_token_here"; $.ajax({ url: 'https://api.spotify.com/v1/browse/new-releases', type: 'GET', dataType: "json", headers: { 'Authorization' : 'Bearer ' + accessToken }, success: function(data) { console.log(data); $.each(data,function(i,item){ //var len = item.items.length; //for(var i=0;i < len;i++){} $.each(item.items,function(i,tmp){ console.log(tmp.images[0].url); $(".img1").append("<img src='"+tmp.images[0].url+"' />"); $(".img2").append("<img src='"+tmp.images[1].url+"' />"); $(".img3").append("<img src='"+tmp.images[2].url+"' />"); }); }); } }); }); </script> </head> <body> <style> .img1,.img2,img3{ width:auto;height:auto; } </style> <div class="container-fluid"> <div class="row"> <div class="col-md-6 img1"> </div> <div class="col-md-6 img2"> </div> <div class="col-md-6 img3"> </div> </div> </div> 是异步的,因此使用检索到的数据的唯一方法是在onDataChange()内部,例如:

onDataChange()

答案 1 :(得分:2)

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

在监听器中移动cCESnapshot代码。

但是要小心,因为每次调用startActivity点击监听器时,您都会添加一个值事件监听器。这样,您将在每次点击中多次调用onItemClick,因此会有多个onDataChange

相反,我建议使用startActivities,它仅在数据进行一次更改后才会触发。