У меня возникают проблемы при обновлении Google Map в моем приложении MapsActivity при чтении координат в Firebase. Я хочу, чтобы при обнаружении изменения базы данных (изменения широты или долготы этой точки) маркер на карте менялся в соответствии с новой широтой и долготой, найденной в базе данных.
Однако, делая это, я осознал, что всякий раз, когда база данных обновляется и вызывается onDataChange (), впоследствии вызывается onCreate (), что приводит к созданию другого экземпляра карты. По этой причине, когда я пытаюсь вернуться на свой телефон (кнопка «Назад»), я останавливаюсь на предыдущих Картах (до изменения базы данных).
Кроме того, карта открывается, даже если приложение не открывается. Запрос к базе данных вызывается в onMapReady (). Код выполняется следующим образом:
Предварительное изменение базы данных:
OnCreate ()
onMapReady ()
- onDataChange () - внутри onMapReady ()
, а затем:
Изменение базы данных:
OnDataChange () * 1 021 *
OnCreate ()
onMapReady ()
- onDataChange () - внутри onMapReady ()
Кто-нибудь знает, почему это происходит?
edit: если это важно отметить, я попытался переместить запросы к базе данных в onCreate () безрезультатно - я переместил его после:
mapFragment.getMapAsync(this);
edit: блок кода для onCreate ()
@Override
protected void onCreate(Bundle savedInstanceState) {
Paper.init(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
StartPinActivity.databaseChildren.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot user : dataSnapshot.getChildren()) {
Child child = user.getValue(Child.class);
assert child != null;
if (child.getPhoneNumber().equals(ProfileAdapter.clickedProfile.getPhoneNumber())) {
if (childMarker == null) {
LatLng childLocation = new LatLng(child.getLatestLat(), child.getLatestLong());
MarkerOptions childMarkerOptions = new MarkerOptions().position(childLocation).title("Child's location");
childMarker = mMap.addMarker(childMarkerOptions);
mMap.moveCamera(CameraUpdateFactory.newLatLng(childMarkerOptions.getPosition()));
Toast.makeText(MapsActivity.this, "A new child location has been received.", Toast.LENGTH_SHORT).show();
break;
}
else {
LatLng childLocation = new LatLng(child.getLatestLat(), child.getLatestLong());
MarkerOptions childMarkerOptions = new MarkerOptions().position(childLocation).title("Child's location");
childMarker.setPosition(childMarkerOptions.getPosition());
mMap.moveCamera(CameraUpdateFactory.newLatLng(childMarkerOptions.getPosition()));
Toast.makeText(MapsActivity.this, "A new child location has been received.", Toast.LENGTH_SHORT).show();
break;
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Button finalizeButton = findViewById(R.id.finalize);
finalizeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
StartPinActivity.databaseParents.child(Paper.book().read(CURRENT_ID).toString()).child("geofences").setValue(geofenceList);
}
});
}