【发布时间】:2018-03-01 11:42:53
【问题描述】:
我用 firebase 编写了一个应用程序,用户可以在其中通过 GeoFire 在其周围显示事件。 Geofire 返回我的 eventID 列表,然后我下载这些事件。问题是,我需要监听这些事件的变化。为每个事件注册 childEventListener 是一个好习惯吗(可能有很多,比如说 100 个)?或者我有更好的方法吗?
感谢您的帮助,Honza
编辑:
赛事是具有以下字段的运动赛事:标题、描述、时间、地点、签名用户等。在我下载了我周围的事件后,我需要监听变化,这样我就可以显示谁将参加这个事件(例如足球比赛)等等。
起初我在 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,我会在发生某些更改时收到通知,但我可能会有大量活动的 childEventListener。
那么这是一个好的做法,还是有更好的方法?
【问题讨论】:
-
究竟如何在事件发生后改变?
-
我假设事件是在 eventID 上触发的。所以他想捕获所有 eventID 上的所有事件?我假设一个
childEventListener只需检查哪个 eventID 触发了该事件就足够了。如果您可以改写您的问题,那就太好了,因为目前还不清楚您在问什么。请提供Minimal, Complete and Verifiyable example。 -
赛事是体育赛事,例如有赛事“足球比赛”,创建的用户可以编辑时间或地点。当其他用户登录此事件时,它会更改 numberOfSignedUsers 字段等...
-
有了这个解释,您应该真正扩展您的原始问题,解释您使用的词语,向我们展示您正在使用的代码并向我们展示您的问题所在。
-
@Ben 问题已更新,希望更清楚:)
标签: java android firebase firebase-realtime-database geofire