如何防止一个活动的addValueEventListener在另一活动中被调用?

时间:2018-12-31 02:37:53

标签: android firebase firebase-realtime-database

我有两个活动,例如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并显示吐司“对不起,您现在不能播放”,这不需要发生。当我参加另一项活动时怎么称呼它?我该如何解决?预先感谢。

2 个答案:

答案 0 :(得分:1)

在将活动从CallableStatement更改为ActivityOne时,尝试放置用于删除侦听器的代码。

  

您可以使用ActivityTwo中的以下代码从回调中删除侦听器:

ActivityOne

答案 1 :(得分:0)

听起来您只想读取一次值,然后只处理结果即可。在这种情况下,您将要使用addListenerForSingleValueEvent()

databaseReference.addListenerForSingleValueEvent(...

其余所有代码都可以保持不变。

使用addListenerForSingleValueEvent意味着Firebase在激发onDataChange之后立即将其删除。因此,它与Deep的答案类似,但是会更快,更隐式地删除监听器。