清洁架构rxjava火力点实施

清洁架构rxjava火力点实施

问题描述:

我使用费尔南多cejas'清洁机器人样板代码为我的项目和 实施火力实时数据库到我的项目,但是,当我调试我的代码,我看到我的发射器是配置每次onDataChange ()被调用(当我添加一个新的行到我的firebase数据库),我的用户界面不是呈现新的列表内容,这里是我的数据模块代码,有什么建议吗?清洁架构rxjava火力点实施

@Override 
public Observable<List> signalEntityList() { 

Firebase myFirebaseRef = new Firebase("https://mydatabase.firebaseio.com/"); 

return Observable.create(emitter -> { 

    if (isThereInternetConnection()) { 

    myFirebaseRef.child("signal").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
     List<SignalEntity> list = new ArrayList<>(); 

     Iterable<DataSnapshot> snapshotIterable = snapshot.getChildren(); 
     Iterator<DataSnapshot> iterator = snapshotIterable.iterator(); 

     while (iterator.hasNext()) { 
      SignalEntity signalEntity = iterator.next().getValue(SignalEntity.class); 
      list.add(signalEntity); 
     } 

     emitter.onNext(list); 
     emitter.onComplete(); 
     } 

     @Override 
     public void onCancelled(FirebaseError error) { 
     emitter.onError(new FirebaseException(error.getMessage())); 
     } 
    }); 
    } else { 
    emitter.onError(new NetworkConnectionException()); 
    } 
}); 
} 
+1

您在数据更改时调用'emmitter.onComplete'。我认为可观察项目在完成时即被处置。 – masp

+0

比你先生,我觉得问题解决了。我不能够感谢你,节省了很多时间。 –

+0

@masp,请您将您的评论作为答案写下,我会接受您的答复作为接受的答案。谢谢。 –

如果你打电话onComplete()你告诉Observable完成它的工作。然后你正在订阅 - 你马上就可以观察完成。 试着去除它,我想你会得到你想要的结果。 顺便说一句,尝试将您的列表平面映射到可迭代的Observable。

@Override 
public Observable<SignalEntity> signalEntityList() { 

Firebase myFirebaseRef = new Firebase("https://mydatabase.firebaseio.com/"); 

Observable<List<SignalEntity>> obs = Observable.create(emitter -> { 

    if (isThereInternetConnection()) { 

    myFirebaseRef.child("signal").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
     List<SignalEntity> list = new ArrayList<>(); 

     Iterable<DataSnapshot> snapshotIterable = snapshot.getChildren(); 
     Iterator<DataSnapshot> iterator = snapshotIterable.iterator(); 

     while (iterator.hasNext()) { 
      SignalEntity signalEntity = iterator.next().getValue(SignalEntity.class); 
      list.add(signalEntity); 
     } 

     emitter.onNext(list); 
     } 

     @Override 
     public void onCancelled(FirebaseError error) { 
     emitter.onError(new FirebaseException(error.getMessage())); 
     } 
    }); 
    } else { 
    emitter.onError(new NetworkConnectionException()); 
    } 
}); 

return obs.flatMap(list -> {new Observable.from(list)}) 
} 
+0

hello @Scrobot,我没有太多的rxjava背景,那么你能解释一下为什么要使用flatmap及其对我的情况的好处吗?谢谢。 –

+1

你好。当您使用Observable时,如果您要处理的所有数据都可以表示为Observable,而不是Observable和其他类型的混合,则可能会更方便。这使您可以使用一组操作员来管理数据流的整个生命周期。例如,可疑事件可以被认为是一种同步的Observable。 – Scrobot

+1

这意味着,您可以使用单个模型项目并将其应用到您需要的所有操作员。如果你想映射你的数据 - 你将映射可迭代的项目,但如果它是列表 - 你必须调用这张map labmda-exprassion中的foreach迭代列表。阅读你的代码并不舒服。我希望你会明白我的意思) – Scrobot