Итак, я использовал эту библиотеку GeoFire (src: https://github.com/firebase/geofire-java), чтобы получить сообщение от пользователя на определенном расстоянии. В моем коде, я сделал этот метод следующим образом:Извлечение данных с использованием GeoQuery
private HashMap<String, GeoLocation> getPostAroundUser(DatabaseReference rootRef) {
final HashMap<String, GeoLocation> postHashMapLocation = new HashMap<String, GeoLocation>();
DatabaseReference refPostGeo = rootRef.child("geo").child("posts");
final GeoFire geoFire = new GeoFire(refPostGeo);
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(mLatitude, mLongitude), 3);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
Log.i(TAG, "Post with key: " + key + " was added to hash with location (lat, long): (" + location.latitude + ", " + location.longitude + ")");
postHashMapLocation.put(key, location);
Log.i(TAG, "number of entry after added " + postHashMapLocation.size());
}
@Override
public void onKeyExited(String key) {
Log.i(TAG, "Post with key: " + key + " was removed");
postHashMapLocation.remove(key);
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
Log.i(TAG, "number of entry onGeoQueryReady " + postHashMapLocation.size());
}
@Override
public void onGeoQueryError(DatabaseError error) {
}
});
Log.i(TAG, "total entry in function: " + postHashMapLocation.size()); //postHashMapLocation.size() returns 0
return postHashMapLocation;
}
Но этот метод возвращает пустой HashMap
, поэтому я добавил журнал, чтобы посмотреть, что происходит, вот лог:
02-21 18:09:32.609 15115-15115/com.example.company.app I/ExampleActivity: total entry in function: 0
02-21 18:09:32.839 15115-15115/com.example.company.app I/ExampleActivity: Post with key: -Kd7DPzEZHSdGHqfbmna was added to hash with location (lat, long): (-6.1459048, 106.692038)
02-21 18:09:32.839 15115-15115/com.example.company.app I/ExampleActivity: number of entry after added 1
02-21 18:09:32.839 15115-15115/com.example.company.app I/ExampleActivity: Post with key: -Kd7DULwW01S9-haorm9 was added to hash with location (lat, long): (-6.1459048, 106.692038)
02-21 18:09:32.839 15115-15115/com.example.company.app I/ExampleActivity: number of entry after added 2
02-21 18:09:32.839 15115-15115/com.example.company.app I/ExampleActivity: Post with key: -Kd7Dt6uvs50qddJHxiA was added to hash with location (lat, long): (-6.1459048, 106.692038)
02-21 18:09:32.839 15115-15115/com.example.company.app I/ExampleActivity: number of entry after added 3
02-21 18:09:32.839 15115-15115/com.example.company.app I/ExampleActivity: Post with key: -Kd7EOF41MijwSfrxpX1 was added to hash with location (lat, long): (-6.1459048, 106.692038)
02-21 18:09:32.839 15115-15115/com.example.company.app I/ExampleActivity: number of entry after added 4
02-21 18:09:32.849 15115-15115/com.example.company.app I/ExampleActivity: Post with key: -KdB3mJvB0K6nSCtNnoL was added to hash with location (lat, long): (-6.1333898, 106.6861029)
02-21 18:09:32.849 15115-15115/com.example.company.app I/ExampleActivity: number of entry after added 5
02-21 18:09:32.849 15115-15115/com.example.company.app I/ExampleActivity: Post with key: -KdB3r13H7y3jiovlLdi was added to hash with location (lat, long): (-6.1333898, 106.6861029)
02-21 18:09:32.849 15115-15115/com.example.company.app I/ExampleActivity: number of entry after added 6
02-21 18:09:32.849 15115-15115/com.example.company.app I/ExampleActivity: Post with key: -KdB58ArIOFKHrfEnYpr was added to hash with location (lat, long): (-6.1335054, 106.6910521)
02-21 18:09:32.849 15115-15115/com.example.company.app I/ExampleActivity: number of entry after added 7
02-21 18:09:32.869 15115-15115/com.example.company.app I/ExampleActivity: number of entry onGeoQueryReady 7
Оказывается, лог я положил перед возвратом HashMap
, который был запущен перед журналом внутри geoQuery
. Вот почему метод возвращает пустой HashMap
Итак, мой вопрос: как мне получить HashMap
изнутри onKeyEntered
для возврата этим методом? Поскольку, как вы можете видеть из журнала, HashMap
был обновлен внутри onKeyPressed
, но я не могу получить его снаружи geoQuery
.
Примечание: Я нашел аналогичную проблему здесь Error performing functions inside a GeoFire and Firebase query, но ответа нет.
Можете ли вы привести мне пример? – YorS
Это действительно зависит от вашего приложения и того, что вы хотите делать с данными. Общим примером может быть обновление вашего адаптера «RecyerlView» или, возможно, карты google из этих обратных вызовов. –