RxJava-使用第一个可观察的结果和第二个可观察的结果

时间:2018-09-20 21:06:00

标签: android retrofit2 rx-java2

我有ServerTime类:

public class ServerTime {

    private String time;

    public ServerTime(String time) {
        this.time = time;
    }    
    public String getTime() {
        return time;
    }
}

和ServerNetwork类:

public class ServerNetwork {

    private String id;
    private String name;

    public ServerNetwork(String id, String name) {
        this.id = id;
        this.name = name;
    }    
    public String getId() {
        return id;
    }
   public String getName(){
        return name;
   }
}

现在,我要按顺序处理此操作,因为我必须为第二个api调用提供时间戳。到目前为止,我已经有了这个,但是我不确定如何处理第一个可观察到的结果,例如将其转换为时间戳,然后将其用于第二个可观察到的api请求。

    Observable<ServerNetwork> serverNetworkObservable = apiInterface
       .getTime()
       .flatMap(time -> apiInterface.getNetworks(time, anothervalue))
       .subscribeOn(Schedulers.newThread())
       .observeOn(AndroidSchedulers.mainThread());

如何启动这些可观察对象以实际调用api?我是RxJava的新手。

1 个答案:

答案 0 :(得分:0)

尝试:

apiInterface.getTime()
            // specify thread for performing network call.
            .subscribeOn(Schedulers.newThread())

            // use emissions from 1st Observable in 2nd Observable.
            .flatMap(serverTime -> {
                String anotherValue = "";
                return apiInterface.getNetworks(serverTime.getTime(), anotherValue);
            })

            // switch to computation thread to transform emissions (optional)
            .observeOn(Schedulers.computation())

            // transform emissions from Observable<ServerNetwork> to Observable<String> (corresponding network ids).
            .map(ServerNetwork::getId)

            // switch to UI thread to consume the transformed emissions.
            .observeOn(AndroidSchedulers.mainThread());
            .subscribe(serverNetworkId -> {
                // update views, etc
                textView.setText(serverNetworkId);
            });

这是推断的接口:

public interface ApiInterface {
    @(...)
    Observable<ServerTime> getTime();

    @(...)
    Observable<ServerNetwork> getNetworks(@Body String timeStamp, @Body String anotherValue);
}

注意:由于您未包含ApiInterface.class文件的代码,因此我试图推断该文件可能包含的内容。我还提供了一些注释,以解释内幕发生了什么,以增加一些清晰度。我包括一个可选的运算符.map(),并使用了多个observeOn,它们是完全可选的。

相关问题