Firebase を使用して近くの場所をクエリしていますが、systemPrint を実行すると結果は正しくなります。しかし、新しい Location アイテムを作成してグローバルに宣言された arrayList に入れようとすると、ArrayList をループして出力します。印刷されません。グローバルハッシュセットを宣言するハッシュセットで同様のことを試し、それにIDと地理位置情報を追加しようとしましたが、ループして印刷されませんでした。
これは、systemPrint を実行したときの出力です。
03-05 21:42:16.225 12604-12604/? I/System.out: aa6b6c55-40da-416e-bbc0-626f10d2db80 51.02878131 -114.13542057
03-05 21:42:16.262 12604-12604/? I/System.out: 1f682c8b-be9a-4310-aa92-216f041f0547 51.02933723 -114.13514678
03-05 21:42:16.262 12604-12604/? I/System.out: 707a5af3-8fa0-4f69-b88f-593a0acd3ee8 51.02933723 -114.13514678
このarrayListをグローバルに設定します
List<Locations> locationList;
in onCreate(){
......
locationList = new ArrayList<>();
......
}
geoFire = new GeoFire(new Firebase("https://xyz.firebaseio.com/locations/"));
GeoLocation center = new GeoLocation(location.getLatitude(), location.getLongitude());
final HashSet hs = new HashSet();
GeoQuery geoQuery = geoFire.queryAtLocation(center, 5);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String username, GeoLocation location) {
System.out.println(username + location.latitude + location.longitude);
Locations eachLocation = new Locations();
eachLocation.setId(username);
eachLocation.setLatitude(String.valueOf(location.latitude));
eachLocation.setLongitude(String.valueOf(location.longitude));
locationList.add(eachLocation);
//
// }
}
@Override
public void onKeyExited(String username) {
usersNearby.remove(username);
// additional code, like removing a pin from the map
// and removing any Firebase listener for this user
}
@Override
public void onKeyMoved(String s, GeoLocation geoLocation) {
}
@Override
public void onGeoQueryReady() {
}
@Override
public void onGeoQueryError(FirebaseError firebaseError) {
}
});
for (Locations x: locationList){
Log.i("eachLocation", x.getId() + x.getLatitude() + x.getLongitude());
}
System.out.println(hs);
これは私のロケーションクラスです
public class Locations {
String id;
String latitude;
String longitude;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getLatitude() {
return latitude;
}
public void setLatitude(String latitude) {
this.latitude = latitude;
}
public String getLongitude() {
return longitude;
}
public void setLongitude(String longitude) {
this.longitude = longitude;
}
}
*****更新 - 別の Firebase クエリ内で関数を実行できない別のパターンにも気付きました****
グローバル userCountry 変数 userCountry を宣言し、クエリを実行して、保存されているユーザーの国を取得します。関数内では、正常にログに記録されます。しかし、国の値を userCountry に設定して、クエリの外部でログに記録しようとすると、アプリがクラッシュし、NullPointerException でエラーが発生します。パラメータとして別のクエリに入力できるように、userCountry をグローバルに設定する必要があります。
String userCountry;
ref = new Firebase("https://xyzChat.firebaseio.com/users/" + intent.getStringExtra("userId") + "/country");
Query queryRef = ref.orderByChild("country");
queryRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.i("userCountry", String.valueOf(dataSnapshot.getValue()));
userCountry = String.valueOf(dataSnapshot.getValue());
}
Log.i("secondUserCountry", userCountry);