我用firebase编写了一个应用程序,用户可以通过GeoFire在周围环境中显示事件。 Geofire返回eventID列表,然后我下载这些事件。问题是,我需要倾听这些事件的变化。为每个事件注册childEventListener是一个好习惯(可以有大量的事件,比方说100)?或者我有更好的方法吗?
感谢任何帮助,Honza
修改
事件是sportEvents,其字段包括:标题,描述,时间,地点,signedUsers等。在我周围环境中下载事件后,我需要听取更改,以便我可以显示,谁将参加此活动(例如足球比赛)等等。
首先,我在geofire
的帮助下在我周围的区域下载eventID private ObservableOnSubscribe<String> suggestedEventIDSource(@NonNull LatLng userLocation, int wantedNumberOfEvents, List<String> sports){
return (e->{
ArrayList<String> suggestedEventIDs = new ArrayList<>();
final GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(userLocation.latitude,userLocation.longitude),radius);
GeoQueryEventListener geoQueryEventListener = new GeoQueryEventListener(){
@Override
public void onKeyEntered(String key, GeoLocation location) {
String[] idParts = key.split(" ");
if((sports.size() == 0 || sports.contains(idParts[0]))
&& !(idParts[idParts.length-1]).equals(currentUser.getUid())
&& !(Meet2SportApp.getSignedEventIDV2().contains(key))){
suggestedEventIDs.add(key);
}
}
@Override
public void onKeyExited(String key) {
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
Log.i(TAG, "onGeoQueryReady: radius - " + radius + " events in radius - " + suggestedEventIDs.size());
if(suggestedEventIDs.size()<wantedNumberOfEvents && radius < 50f){
radius++;
e.onComplete();
}
else {
for(String eventID : suggestedEventIDs)
e.onNext(eventID);
}
}
@Override
public void onGeoQueryError(DatabaseError error) {
}
};
geoQuery.addGeoQueryEventListener(geoQueryEventListener);
e.setCancellable(geoQuery::removeAllListeners);
});
}
然后我使用valueEventListener
下载每个事件 private SingleOnSubscribe<DataSnapshot> sourceOfEvent(String eventID){
return (e -> {
RxJavaPlugins.setErrorHandler(Functions.emptyConsumer());
Log.i(TAG, "Downloading event: " + eventID + " on thread " + Thread.currentThread().getName());
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
e.onSuccess(dataSnapshot);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
};
eventDB.child(eventID).addListenerForSingleValueEvent(valueEventListener);
});
}
这很好,但是当发生一些变化时,应用程序不会更新。 因此,如果我使用childEventListener而不是valueEventListener,我会在发生一些变化时收到通知,但我会有大量活跃的childEventListeners。
这是一个很好的做法,还是有更好的方法?
答案 0 :(得分:-1)
是的,你可以拥有多个ChildEventListeners,这是一个很好的做法。您应该使用一个并且具有LinkedHashMap类型结构,以便您可以将数据分配给某个Key,然后可以稍后回调。