Что делать, если geoQuery не выводит данные?

Я использую GeoFire для чтения данных о местоположении в Firebase, а затем добавляю их на карту Google.

Когда я запускаю метод GeoQueryDataEventListener (), в зависимости от установленного центра и радиуса он не дает никаких результатов (и это нормально, потому что у меня нет загруженной информации для этих параметров).

Затем, когда это произойдет, я хотел бы, чтобы пользователь выдал предупреждение об изменении радиуса поиска (например).

В какую часть метода GeoQueryDataEventListener () следует вставить предупреждение? Я тестировал все подметоды, но ни один не преуспел.

Оставляю код, который написал:

private void leerUbicaciones() {

    GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(userLatitude, userLongitude), radio);

    geoQuery.addGeoQueryDataEventListener(new GeoQueryDataEventListener() {
        @Override
        public void onDataEntered(DataSnapshot dataSnapshot, GeoLocation location) {
            final String key = dataSnapshot.getKey();
            firebaseDatabase = FirebaseDatabase.getInstance();
            firebaseDatabase.getReference().child("location/" + key).addValueEventListener(new ValueEventListener() {

                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    mMap.addMarker(new MarkerOptions()
                            .snippet(dataSnapshot.child("city").getValue(String.class))
                            .title(dataSnapshot.child("name").getValue(String.class))
                            .draggable(false)
                            .position(new LatLng(dataSnapshot.child("latitude").getValue(Double.class), dataSnapshot.child("longitude").getValue(Double.class))));

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.v("TAG", "onCancelled");
                }
            });
        }

        @Override
        public void onDataExited(DataSnapshot dataSnapshot) {
            Log.v("TAG", "onDataExited");

        }

        @Override
        public void onDataMoved(DataSnapshot dataSnapshot, GeoLocation location) {
            Log.v("TAG", "onDataMoved");


        }

        @Override
        public void onDataChanged(DataSnapshot dataSnapshot, GeoLocation location) {
            Log.v("TAG", "onDataChanged");

        }

        @Override
        public void onGeoQueryReady() {
            Log.v("TAG", "onGeoQueryReady");

        }

        @Override
        public void onGeoQueryError(DatabaseError error) {
            Log.v("TAG", "onGeoQueryError");
        }
    });
}

Во-первых, необходимо проверить, вызывается ли ваш onDataEntered, либо путем добавления оператора Log.v("TAG", "onDataEntered"); в качестве первой строки внутри него, либо путем запуска кода в отладчике и установки точки останова на первой строке внутри него.

Frank van Puffelen 01.07.2018 17:52

Я проверил, но без результатов метод onDataEntered не вызывается.

Pablo G 01.07.2018 19:17

Ах, извините, я неправильно понял ваш вопрос. Вы захотите использовать onGeoQueryReady, чтобы определить, когда запрос выполнен. Напишу ответ.

Frank van Puffelen 01.07.2018 20:54
1
3
530
1

Ответы 1

Когда вы выполняете гео-запрос, onDataEntered немедленно срабатывает для каждого узла в пределах диапазона. Когда onDataEntered вызывается для всех узлов, вызывается ваш onGeoQueryReady, чтобы сигнализировать, что начальные результаты запроса были обработаны.

Если после этого в диапазон запроса войдет другой узел, ваш onDataEntered также сработает. После того, как onDataEntered был вызван для всех узлов, входящих в диапазон, ваш onGeoQueryReady снова вызывается, чтобы сигнализировать об окончании обновления.

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