2017-02-21 26 views
0

Итак, я использовал эту библиотеку 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, но ответа нет.

ответ

0

Обратные вызовы Geofire (такие как onKeyEntered) вызываются асинхронно .... более чем вероятно после того, как вы вернетесь из своего метода getPostAroundUser. Вам нужно будет структурировать ваше приложение соответственно.

+0

Можете ли вы привести мне пример? – YorS

+0

Это действительно зависит от вашего приложения и того, что вы хотите делать с данными. Общим примером может быть обновление вашего адаптера «RecyerlView» или, возможно, карты google из этих обратных вызовов. –

0

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

+0

Мое предложение состоит в том, чтобы добавить postHashMapLocation как глобальную переменную вместо локальной – user3918641