RxJava - Запуск двух наблюдаемых последовательно, используя результат из первой наблюдаемой во вторую наблюдаемую - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть класс 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 голосов
/ 04 октября 2018

Попробуйте:

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 Iпытался сделать вывод, что этот файл может содержать.Я также включил некоторые комментарии, чтобы объяснить, что происходит под капотом , чтобы добавить некоторую ясность.Я включил необязательный оператор .map() и использовал несколько observeOn, они совершенно необязательны.

...