gpt4 book ai didi

java - Firebase/GeoQuery - 最大半径 IF 语句

转载 作者:行者123 更新时间:2023-12-02 08:38:59 32 4
gpt4 key购买 nike

所以我已经尝试了一段时间来实现一种方法,如果没有找到商人或者在最大半径内没有商人,我可以更新用户。因此,该应用程序基本上会搜索 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) {

}
});
}

这已经困扰我一段时间了,因为在我看来这似乎是一件非常简单明了的事情,所以任何帮助都会减轻很多压力。谢谢

最佳答案

你们真的很接近。当 geoquery 完成加载其初始数据时,它会调用 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)

半径以公里为单位,如 example query in the docs 所示。 .

关于java - Firebase/GeoQuery - 最大半径 IF 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61501753/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com