Почему моя Карта Google продолжает создавать новые экземпляры карты после запуска метода Firbase onDataChange ()? - PullRequest
0 голосов
/ 04 января 2019

У меня возникают проблемы при обновлении 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);
        }
    });

}

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Спасибо всем за ваши ответы!

Я наконец исправил свою программу; на самом деле это была простая ошибка, которой не было даже в той деятельности, которую я смотрел все это время Когда onDataChange вызывается в одном действии, он также вызывается во всех своих экземплярах во всех других действиях. Я случайно запустил функцию MapsActivity onDataChange () в своем предыдущем действии, поэтому каждый раз, когда данные менялись в моей базе данных, вызывался метод onCreate ()!

0 голосов
/ 05 января 2019

Не следует создавать экземпляр карты каждый раз, когда вызывается метод onCreate(). Вместо этого вам нужно сохранить экземпляр карты после его создания. И после этого проверьте, существует ли этот экземпляр или нет, перед созданием другого экземпляра карты (т.е. после срабатывания onDataChange()).

...