我有两个活动,例如ActivityOne.java和ActivityTwo.java。我要从ActivityOne导航到ActivityTwo,条件如下。
databaseReference=FirebaseDatabase.getInstance().getReference().child("users").child(UserDetails.username).child("isPlaying");
databaseReference.addValueEventListener(new com.google.firebase.database.ValueEventListener() {
@Override
public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot)
{
if(dataSnapshot.getValue().toString().equals("false")){
Intent intent1 = new Intent(ActivityOne.this,ActivityTwo.class);
startActivity(intent1);
}else{
Toast.makeText(ActivityOne.this,"You cannot play now",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
最初,返回的值将为false并将启动ActivityTwo.java。现在在ActivityTwo.java中,我在同一节点上进行了更改,并将其值更改为“ true”。
final ProgressDialog pd = new ProgressDialog(NumberGuess.this);
pd.setMessage("Loading...");
pd.show();
String url = "https://couplegoals-80d0f.firebaseio.com/users.json";
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>(){
@Override
public void onResponse(String s) {
Firebase reference = new Firebase("https://couplegoals-80d0f.firebaseio.com/users");
reference.child(UserDetails.username).child("isPlaying").setValue("true");
pd.dismiss();
}
},new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError volleyError) {
pd.dismiss();
}
});
RequestQueue rQueue = Volley.newRequestQueue(NumberGuess.this);
rQueue.add(request);
这再次在ActivityOne.java中调用addValueEventListener并显示吐司“对不起,您现在不能播放”,这不需要发生。当我参加另一项活动时怎么称呼它?我该如何解决?预先感谢。
答案 0 :(得分:1)
在将活动从CallableStatement
更改为ActivityOne
时,尝试放置用于删除侦听器的代码。
您可以使用
ActivityTwo
中的以下代码从回调中删除侦听器:
ActivityOne
答案 1 :(得分:0)
听起来您只想读取一次值,然后只处理结果即可。在这种情况下,您将要使用addListenerForSingleValueEvent()
:
databaseReference.addListenerForSingleValueEvent(...
其余所有代码都可以保持不变。
使用addListenerForSingleValueEvent
意味着Firebase在激发onDataChange
之后立即将其删除。因此,它与Deep的答案类似,但是会更快,更隐式地删除监听器。