有什么方法可以从代码所在的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之前运行。
答案 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
,它仅在数据进行一次更改后才会触发。