Как остановить один Childrenlistener, когда другой Childrenlistener запускается в firebase android

У меня есть два childrenlistener из firebase в одном и том же действии, вызываемом из всплывающего меню с двумя вариантами. (два варианта, два детских слушателя).

Мне нужно только запустить childrenlistener, то есть, если пользователь нажимает «option1», их поток создается, и если пользователь нажимает «option2», поток «option1» отменяется и показывает только данные потока «option2». " наоборот

PopupMenu popup = new PopupMenu(Ruta1Manantiales.this, busLocation);
            popup.getMenuInflater().inflate(R.menu.sentidos, popup.getMenu());
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.toString()){
                        case "option1":
                            _globalString = "option1";
                            loginToFirebase();
                            break;
                        case "option2":
                            _globalString = "option2";
                            loginToFirebase();
                            break;
                    }
                    return true;
                }
            });
            popup.show(); //showing popup menu

private void loginToFirebase() {
    // Authenticate with Firebase, and request location updates
    FirebaseUser currentUser = mAuth.getCurrentUser();
    if (currentUser!=null){
        if (_globalString == "ida"){
            checkIfChildrenExistIda();
        }

        if (_globalString == "vuelta"){
            checkIfChildrenExistVuelta();
        }
    }
    else{
        Toast.makeText(getApplicationContext(),
                "Firebase auth failed",
                Toast.LENGTH_LONG)
                .show();
        Log.d(TAG, "firebase auth failed");
    }
}

private void checkIfChildrenExistIda(){
    DatabaseReference fbDb = null;
    if (fbDb == null) {
        fbDb = FirebaseDatabase.getInstance().getReference();
    }


    fbDb.child("locations/unidad_1/ida")
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    // get total available quest
                    int size = ((int) dataSnapshot.getChildrenCount());
                    if (size >= 1){
                        subscribeToUpdatesIda();
                    } else if (size <= 0){
                        Toast.makeText(getApplicationContext(),
                                "No buses available",
                                Toast.LENGTH_LONG)
                                .show();
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
}

private void checkIfChildrenExistVuelta(){
    DatabaseReference fbDb = null;
    if (fbDb == null) {
        fbDb = FirebaseDatabase.getInstance().getReference();
    }


    fbDb.child("locations/unidad_1/vuelta")
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    // get total available quest
                    int size = ((int) dataSnapshot.getChildrenCount());
                    if (size >= 1){
                        subscribeToUpdatesVuelta();
                    } else if (size <= 0){
                        Toast.makeText(getApplicationContext(),
                                "No hay camiones disponibles",
                                Toast.LENGTH_LONG)
                                .show();
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
}


private void subscribeToUpdatesIda() {
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("locations").child("unidad_1").child("ida");
    ref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
            setMarkerIda(dataSnapshot);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
            setMarkerIda(dataSnapshot);
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            removeMarkerIda(dataSnapshot);
            //Toast.makeText(Ruta1Manantiales.this, "child removed", Toast.LENGTH_LONG).show();

        }

        @Override
        public void onCancelled(DatabaseError error) {
            Log.d(TAG, "Failed to read value.", error.toException());
        }
    });
}

private void removeMarkerIda(DataSnapshot dataSnapshot) {
    //Toast.makeText(Ruta1Manantiales.this, "child removed 2", Toast.LENGTH_LONG).show();
    String key = dataSnapshot.getKey();
    HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();

    if (mMarkers.containsKey(key)) {
        Marker marker = mMarkers.remove(key);
        if (marker != null){
            marker.remove();
        }
    }
}

private void setMarkerIda(DataSnapshot dataSnapshot) {
    // When a location update is received, put or update
    // its value in mMarkers, which contains all the markers
    // for locations received, so that we can build the
    // boundaries required to show them all on the map at once
    Bitmap markerBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bus_marker);
    markerBitmap = scaleBitmap(markerBitmap, 70, 70);


    String key = dataSnapshot.getKey();
    HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();
    double lat = Double.parseDouble(value.get("latitude").toString());
    double lng = Double.parseDouble(value.get("longitude").toString());
    LatLng location = new LatLng(lat, lng);
    if (!mMarkers.containsKey(key)) {
        mMarkers.put(key, mMap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(markerBitmap)).title("Ruta 1 - Unidad-Manantiales").position(location)));
    } else {
        mMarkers.get(key).setPosition(location);
    }


    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (Marker marker : mMarkers.values()) {
        builder.include(marker.getPosition());
    }

    if (firstLoad) {
        mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 13));
        LatLng marker = new LatLng(19.407021,  -102.046595);
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 12.9f));
        firstLoad = false;
    }
}

private void subscribeToUpdatesVuelta() {
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("locations").child("unidad_1").child("vuelta");
    ref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
            setMarkerVuelta(dataSnapshot);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
            setMarkerVuelta(dataSnapshot);
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            removeMarkerVuelta(dataSnapshot);
            //Toast.makeText(Ruta1Manantiales.this, "child removed", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onCancelled(DatabaseError error) {
            Log.d(TAG, "Failed to read value.", error.toException());
        }
    });
}

private void removeMarkerVuelta(DataSnapshot dataSnapshot) {
    //Toast.makeText(Ruta1Manantiales.this, "child removed 2", Toast.LENGTH_LONG).show();
    String key = dataSnapshot.getKey();
    HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();

    if (mMarkers.containsKey(key)) {
        Marker marker = mMarkers.remove(key);
        if (marker != null){
            marker.remove();
        }
    }
}

private void setMarkerVuelta(DataSnapshot dataSnapshot) {
    // When a location update is received, put or update
    // its value in mMarkers, which contains all the markers
    // for locations received, so that we can build the
    // boundaries required to show them all on the map at once
    Bitmap markerBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bus_marker);
    markerBitmap = scaleBitmap(markerBitmap, 70, 70);


    String key = dataSnapshot.getKey();
    HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();
    double lat = Double.parseDouble(value.get("latitude").toString());
    double lng = Double.parseDouble(value.get("longitude").toString());
    LatLng location = new LatLng(lat, lng);
    if (!mMarkers.containsKey(key)) {
        mMarkers.put(key, mMap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(markerBitmap)).title("Ruta 1 - Unidad-Manantiales").position(location)));
    } else {
        mMarkers.get(key).setPosition(location);
    }


    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (Marker marker : mMarkers.values()) {
        builder.include(marker.getPosition());
    }

    if (firstLoad) {
        mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 13));
        LatLng marker = new LatLng(19.407021,  -102.046595);
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 12.9f));
        firstLoad = false;
    }
}
0
0
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы прикрепляете слушателя к ссылке / запросу, Firebase возвращает ссылку на этот слушатель. Вы захотите сохранить эту ссылку в поле участника:

ChildEventListener mActiveListener;

А затем, когда вы прикрепите слушателя:

mActiveListener = ref.addChildEventListener(new ChildEventListener() {
  ...

Затем, когда вы будете готовы присоединить другого слушателя, сначала удалите предыдущий с помощью:

if (mActiveListener != null) {
  ref.removeEventListener(mActiveListener);
}

Спасибо! ваша помощь сработала, я только добавил "ref" в качестве глобальной переменной, чтобы она была распознана другим слушателем

Emmanuel Molina 21.08.2018 23:48

если я снова нажму активный слушатель, приложение выйдет из строя :(. java.lang.NullPointerException: попытка вызвать виртуальный метод void com.google.firebase.database.Query.removeEventListener (com.g‌ oogle.firebase.datab‌ ase .ChildEventListen‌ er) 'для ссылки на нулевой объект

Emmanuel Molina 29.08.2018 20:10

Похоже, вы установили ref на null.

Frank van Puffelen 30.08.2018 00:16

Другие вопросы по теме