private Flowable<List<String>> getInfo(){
List<String> myList = new ArrayList<>();
return BehaviorProcessor.create(emitter->{
FirebaseDatabase.getInstance().getReference("url")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (null != dataSnapshot) {
if (dataSnapshot.exists()) {
if (dataSnapshot.hasChildren()) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
final MyClass myClass= postSnapshot.getValue(MyClass.class);
String key = postSnapshot.getKey();
String firsnName = myClass.getFirstName();
myList.add(0, key);
myList.add(1, firsnName);
}
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}, BackpressureStrategy.LATEST);
}
private Flowable<GeoLocation> setMyLocation(){
Flowable.create(emitter -> {
geoFire.setLocation(key, new GeoLocation(myLastLocation.getLatitude(),
myLastLocation.getLongitude()), (k, e) ->{
});
});
}
我想将列表中的值传递到下一个方法中。具体来说,我需要将我的密钥传递到 GeoFire 的 setLocation 方法中,作为密钥,如图所示。我确实了解onDataChange是异步调用的,并且我习惯于使用callbackListener在我的Activity类中执行此操作。如何在我的视图模型中执行上述操作?我愿意更改整个实现以获得可行的解决方案。
我正在使用Android Java中的ViewModel,LiveDataReactiveStream。我希望在我的ViewModel中使用RxJava找到解决方案。
谢谢。
不要使用List
,创建自己的对象,说Info
:
class Info {
private final String key;
private final String firstName;
public Info(String key, String firstName) {
this.key = key;
this.firstName = firstName;
}
...
}
那么你的getInfo
将是这样的:
private Flowable<Info> getInfo(){
return BehaviorProcessor.create(emitter->{
FirebaseDatabase.getInstance().getReference("url")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (null != dataSnapshot) {
if (dataSnapshot.exists()) {
if (dataSnapshot.hasChildren()) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
final MyClass myClass= postSnapshot.getValue(MyClass.class);
String key = postSnapshot.getKey();
String firstName = myClass.getFirstName();
// use emitter here
emitter.onNext(new Info(key, firstName))
}
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
// use emitter here
emitter.onError(/*error*/)
}
});
}, BackpressureStrategy.LATEST);
}
,然后更改setMyLocation
的签名以接受密钥。
之后使用concatMap
运算符链接您的请求:
getInfo()
.concatMap(info -> setMyLocation(info.key))
.subscribe();
希望这有帮助