如何将值从回调传递到另一个方法


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();

希望这有帮助

相关内容

  • 没有找到相关文章

最新更新