【问题标题】:How to pass values from Callback into another method如何将回调中的值传递给另一个方法
【发布时间】:2020-06-22 01:47:06
【问题描述】:
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 类中使​​用回调侦听器来执行此操作。如何在我的 ViewModel 中执行上述操作?我愿意改变整个实施以找到一个可行的解决方案。

我在 Android Java 中使用 ViewModel、LiveDataReactiveStream。我希望能在我的 ViewModel 中使用 RxJava 找到解决方案。

谢谢。

【问题讨论】:

  • myList 是什么?它在哪里声明?
  • @bubbles 我已编辑以实例化 myList。我正在使用 myList 存储从数据快照返回的字段。
  • 这里有编译错误? Flowable&lt;List&lt;String&gt;&gt; getInfo() 但你要返回一个列表!
  • @bubbles 我已经进行了编辑。没有更多的编译错误。

标签: java android callback viewmodel geofire


【解决方案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();

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2014-01-05
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    相关资源
    最近更新 更多