java - 拥有大量的 childEventListener 是一个好习惯吗?

标签 java android firebase firebase-realtime-database geofire

我用 firebase 编写了一个应用程序,用户可以通过 GeoFire 显示周围的事件。 Geofire 返回事件 ID 列表,然后我下载这些事件。问题是,我需要监听这些事件的变化。为每个事件注册 childEventListener 是一个好习惯吗(可以有很多事件,比如说 100 个)?或者有更好的方法吗?

感谢您的帮助,Honza

编辑:

Activity 是带有以下字段的运动 Activity :标题、描述、时间、地点、签名用户等。下载周围的事件后,我需要监听变化,以便我可以显示谁将参加此事件(例如足球比赛)等等。

首先,我在 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,当发生某些更改时我会收到通知,但我可能会有大量 Activity 的 childEventListener。

那么这是一个好的做法,还是有更好的方法?

最佳答案

是的,您可以拥有多个 ChildEventListener,这是一个好的做法吗?您确实应该使用一个 LinkedHashMap 类型结构,以便您可以将数据分配给某个 Key,然后您可以稍后回调该 Key。

关于java - 拥有大量的 childEventListener 是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49049012/

相关文章:

ios - 处理电子邮件不存在错误 - 使用 swift 的 iOS 项目

firebase - 使用 firebase web 保留数据

java - 初学者构建 jsp 的指导

java - 在不知道索引的情况下从 ArrayList 中删除对象

android - 如何在 POST 请求中将 JSON 作为 BODY 从 Android 应用程序发送到服务器?

android - 工具栏图标不显示

java - gradle测试错误:retrolambda.oldJdk

java - 在 JOOQ 的 ExecuteListener 中访问插入/更新 map

android - OpenCV Android - 匹配模板错误

java - 从 Single ValueEventListener 获取 firebase 引用