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是异步调用的,并且我习惯于在我的Activity类中使用callbackListener进行此操作。如何在ViewModel中执行上述操作?我愿意为一个可行的解决方案更改整个实现。
我在Android Java中使用ViewModel,LiveDataReactiveStream。我希望能获得帮助,在ViewModel中使用RxJava查找解决方案。
谢谢。
答案 0 :(得分:1)
不要使用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();
希望这会有所帮助