如何将值从“回调”传递到另一种方法

时间:2020-06-22 01:47:06

标签: java android callback viewmodel geofire

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查找解决方案。

谢谢。

1 个答案:

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

希望这会有所帮助