rxjava .zip onNext() не выполняется

я объединил несколько наблюдателей в zip для выполнения нескольких запросов с сервера, но onNext не выполняется, поэтому я не могу получить возвращаемые значения. menuName, restaurantName и userName являются глобальными переменными.

public void getOrderValues(String restaurantIdx,String menuIdx,String userIdx ) {

    try {
        Observable<Restaurant> orderRestaurant = IdentityClient.getAPIService()

                .getRestaurantById(restaurantIdx)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread());


        Observable<Menu> orderMenu = IdentityClient.getAPIService()
                .getMenuById(menuIdx)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread());


        Observable<User> orderUser = IdentityClient.getAPIService()
                .getUserById(userIdx)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread());


        Observable.zip(orderRestaurant, orderMenu, orderUser, new Function3<Restaurant, Menu, User, OrderValues>() {
            @Override
            public OrderValues apply(@NonNull Restaurant restaurant,@NonNull Menu menu,@NonNull User user) throws Exception {
                return new OrderValues(restaurant, menu, user);
            }
        }).subscribe(new Observer<OrderValues>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.e("Eatright Error", d.toString()+"");
            }

            @Override
            public void onNext(OrderValues orderValues) {
                menuName = orderValues.menu.getName();
                restaurantName = orderValues.restaurant.getName();
                userName = orderValues.user.getUserName();

            }

            @Override
            public void onError(Throwable e) {
                Log.e("Eatright Error", e.getMessage()+"");
            }

            @Override
            public void onComplete() {
                Log.e("Eatright Error","Completed");
            }
        });
    } catch (Exception e) {
        Log.e("Error Eatright", e.getMessage()+"");
    }


}}
  //GET restaurant by Id
@GET("/api/restaurants/getrestaurant/{id}")
Observable<Restaurant> getRestaurantById(
        @Path("id") String id);

//GET menu by Id
@GET("/api/menus/getmenu/{id}")
Observable<Menu> getMenuById(
        @Path("id") String id);

 @GET("/api/account/user/{id}")
Observable<User> getUserById( @Path("id") String id
);

Когда я подписываю наблюдаемые объекты на отдельных наблюдателей, я получаю возвращаемое значение onNext, но не при их объединении.

API-тест на почтальоне

    {
  "RestaurantId": "00000000-0000-0000-0000-000000000000",
  "Name": "Papaye",
  "City": null,
  "Town": null,
  "Description": null,
  "Image": null,
  "DateCreated": null,
  "Contact1": null,
  "Contact2": null,
  "NumOfSeats": null
}

{
  "MenuId": "00000000-0000-0000-0000-000000000000",
  "RestaurantId": null,
  "Name": "Fufu and Light Soup",
  "Price": null,
  "MainImage": null,
  "LastModified": null,
  "DateCreated": null,
  "Type": null
}

{
  "userName": "[email protected]"
}

person Beulah Ana    schedule 17.04.2017    source источник
comment
Можете ли вы показать реализацию getRestaurantById (или getMenuById, getUserById)?   -  person GVillani82    schedule 17.04.2017
comment
отредактировал сообщение GVillani82   -  person Beulah Ana    schedule 17.04.2017
comment
прочитайте это: stackoverflow.com/a/42455515/3903847 вы не получите onNext без запроса элементов у подписчика, альтернативно используйте другие перегружены, как указал @GVillani82   -  person yosriz    schedule 17.04.2017
comment
Будет ли это работать, если вы замените 3 входа фиктивными источниками Observable.just(), каждый из которых возвращает некоторые значения по умолчанию?   -  person akarnokd    schedule 18.04.2017


Ответы (2)


Попробуй это:

Observable.zip(orderRestaurant, orderMenu, orderUser, new Function3<Restaurant, Menu, User, OrderValues>() {
            @Override
            public OrderValues apply(@NonNull Restaurant restaurant,@NonNull Menu menu,@NonNull User user) throws Exception {
                return new OrderValues(restaurant, menu, user);
            }
        }).subscribe(new Consumer<Object>() {
            @Override
            public void accept(@NonNull Object o) throws Exception {
                menuName = orderValues.menu.getName();
                restaurantName = orderValues.restaurant.getName();
                userName = orderValues.user.getUserName();
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(@NonNull Throwable e) throws Exception {
                Log.e("Eatright Error", e.getMessage()+"");
            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                Log.e("Eatright Error","Completed");
            }
        });
person GVillani82    schedule 17.04.2017
comment
По-прежнему пропускает точку останова в accept....menuName,restaurantName,userName все еще null - person Beulah Ana; 17.04.2017

Попробуйте немного изменить свой код:

public void getOrderValues(String restaurantIdx,String menuIdx,String userIdx ) {

try {
    Observable<Restaurant> orderRestaurant = IdentityClient.getAPIService()

            .getRestaurantById(restaurantIdx)
            .subscribeOn(Schedulers.newThread());

    Observable<Menu> orderMenu = IdentityClient.getAPIService()
            .getMenuById(menuIdx)
            .subscribeOn(Schedulers.newThread());

    Observable<User> orderUser = IdentityClient.getAPIService()
            .getUserById(userIdx)
            .subscribeOn(Schedulers.newThread());

    Observable.zip(orderRestaurant, orderMenu, orderUser, new Function3<Restaurant, Menu, User, OrderValues>() {
        @Override
        public OrderValues apply(@NonNull Restaurant restaurant,@NonNull Menu menu,@NonNull User user) throws Exception {
            return new OrderValues(restaurant, menu, user);
        }
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<OrderValues>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e("Eatright Error", d.toString()+"");
        }

        @Override
        public void onNext(OrderValues orderValues) {
            menuName = orderValues.menu.getName();
            restaurantName = orderValues.restaurant.getName();
            userName = orderValues.user.getUserName();

        }

        @Override
        public void onError(Throwable e) {
            Log.e("Eatright Error", e.getMessage()+"");
        }

        @Override
        public void onComplete() {
            Log.e("Eatright Error","Completed");
        }
    });
} catch (Exception e) {
    Log.e("Error Eatright", e.getMessage()+"");
}


}}
person Sergey    schedule 17.04.2017
comment
такая же проблема. отладчик только достигает точки останова onSubscribe и выходит из метода - person Beulah Ana; 17.04.2017