Firebase / GeoQuery - Максимальный радиус IF IF - PullRequest
0 голосов
/ 29 апреля 2020

Таким образом, я некоторое время пытался реализовать способ, которым я могу обновить пользователя, если не найден торговец или если в максимальном радиусе нет торговца. Таким образом, приложение в основном ищет торговца, доступного в Firebase, и сопоставляет его с ближайшим по широте и долготе. Если ничего не найдено в пределах 1 мили, оно увеличивается до 2 и так далее.

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

Это код, который у меня сейчас есть, который ищет торговца и увеличивает радиус, но никогда не остановит поиск, пока я не нажму кнопку, которая завершает поиск, поэтому мне нужен способ завершить поиск, не нажимая кнопку кнопка.

private int radius = 1; // 1 radius (mile or km not sure)
private int max_radius = 15;
private Boolean tradesmanFound = false;
private String tradesmanFoundID;
GeoQuery geoQuery;

private void getClosestTradesman() {
    DatabaseReference tradesmanLocation = FirebaseDatabase.getInstance().getReference().child("TradesmanAvailable");

    GeoFire geoFire = new GeoFire(tradesmanLocation);
    geoQuery = geoFire.queryAtLocation(new GeoLocation(customerLocation.latitude, customerLocation.longitude), radius);
    geoQuery.removeAllListeners();

    geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
        @Override
        public void onKeyEntered(String key, GeoLocation location) {
            if (!tradesmanFound && requestBol) {
                DatabaseReference customerDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child("Tradesman").child(key);
                customerDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.exists() && dataSnapshot.getChildrenCount() > 0) {
                            Map<String, Object> tradesmanMap = (Map<String, Object>) dataSnapshot.getValue();
                            if (tradesmanFound) {
                                return;
                            }

                            if (tradesmanMap.get("Trade").equals(tradeType)) {
                                tradesmanFound = true;
                                tradesmanFoundID = dataSnapshot.getKey();

                                DatabaseReference tradesmanRef = FirebaseDatabase.getInstance().getReference().child("Users").child("Tradesman").child(tradesmanFoundID).child("CustomerRequest");
                                String customerID = FirebaseAuth.getInstance().getCurrentUser().getUid();
                                HashMap map = new HashMap();
                                map.put("CustomerRequestID", customerID);
                                tradesmanRef.updateChildren(map);

                                getTradesmanLocation();
                                getTradesmanInfo();
                                isRequestFinished();
                                requestTradesmanBtn.setText("Looking for Tradesman's Location...");
                            }
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                    }
                });
            }
        }

        @Override
        public void onKeyExited(String key) {

        }

        @Override
        public void onKeyMoved(String key, GeoLocation location) {

        }

        @Override
        public void onGeoQueryReady() {
            if (!tradesmanFound) {

                radius++;
                getClosestTradesman();

            }
        }

        @Override
        public void onGeoQueryError(DatabaseError error) {

        }
    });
}

Это беспокоило меня некоторое время, так как мне кажется, что в моей голове что-то довольно простое и прямолинейное, поэтому любая помощь поможет пережить много стресса. Спасибо

1 Ответ

1 голос
/ 29 апреля 2020

Ты действительно близко. Когда гео-запрос загружает свои исходные данные, он вызывает onGeoQueryReady, который у вас сейчас есть:

@Override
public void onGeoQueryReady() {
    if (!tradesmanFound) {

        radius++;
        getClosestTradesman();

    }
}

Так что, если торговцы не найдены, вы начинаете новый запрос с большим радиусом. Из этого не хватает двух вещей:

  1. Новый запрос следует начинать только в том случае, если вы еще не достигли максимального диапазона.
  2. Следует отменить существующий гео-запрос, который был просто завершено, в противном случае вы получите множество перекрывающихся гео-запросов.

Итак, в коде:

@Override
public void onGeoQueryReady() {
    if (!tradesmanFound && radius < 10) {

        geoQuery.removeAllListeners();

        radius++;
        getClosestTradesman();

    }
}

Я знаю, что вы уже звонили на geoQuery.removeAllListeners(), но там, где он у вас есть, он на самом деле ничего не делает.


Я заметил это в вашем коде:

private int radius = 1; // 1 radius (mile or km not sure)

Радиус в километрах, как видно из пример запроса в документах .

...