У меня есть два 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;
}
}
Когда вы прикрепляете слушателя к ссылке / запросу, Firebase возвращает ссылку на этот слушатель. Вы захотите сохранить эту ссылку в поле участника:
ChildEventListener mActiveListener;
А затем, когда вы прикрепите слушателя:
mActiveListener = ref.addChildEventListener(new ChildEventListener() {
...
Затем, когда вы будете готовы присоединить другого слушателя, сначала удалите предыдущий с помощью:
if (mActiveListener != null) {
ref.removeEventListener(mActiveListener);
}
если я снова нажму активный слушатель, приложение выйдет из строя :(. java.lang.NullPointerException: попытка вызвать виртуальный метод void com.google.firebase.database.Query.removeEventListener (com.g oogle.firebase.datab ase .ChildEventListen er) 'для ссылки на нулевой объект
Похоже, вы установили ref на null.
Спасибо! ваша помощь сработала, я только добавил "ref" в качестве глобальной переменной, чтобы она была распознана другим слушателем