Как предотвратить addValueEventListener одного действия, вызываемого в другом действии? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть два вида деятельности, например 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) {

    }
});

Первоначально возвращаемое значение будет ложным, и будет запущен 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);

Это снова вызывает addValueEventListener в ActivityOne.java и отображает тост «Извините, вы не можете играть сейчас», что не должно происходить.Как это называется, когда я в другой деятельности?Как я могу решить это?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Похоже, вы хотите прочитать значение только один раз, а затем просто обработать результат.В этом случае вы захотите использовать addListenerForSingleValueEvent():

databaseReference.addListenerForSingleValueEvent(...

Весь остальной код может остаться прежним.

Использование addListenerForSingleValueEvent означает, что Firebase немедленно удаляет слушателяпосле того как он выстрелил onDataChange.Так что это похоже на ответ Deep, но удаляет слушателя быстрее и неявно.

0 голосов
/ 31 декабря 2018

При изменении активности с ActivityOne на ActivityTwo попробуйте ввести код для удаления слушателя.

С помощью этого кода вы можете удалить слушателя из обратного вызовав вашем ActivityOne:

 @Override
    protected void onDestroy() {
        super.onDestroy();
        ref.removeEventListener(this); //ref will be your node where you are setting Event Listener.
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...