【问题标题】:rxjava .zip onNext() not executedrxjava .zip onNext() 未执行
【发布时间】:2017-04-17 11:06:40
【问题描述】:

我在 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
);

当我将 observables 订阅给单个观察者时,我会在 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": "buelersandra@gmail.com"
}

【问题讨论】:

  • 你能展示一下getRestaurantById(或getMenuByIdgetUserById)的实现吗?
  • 已编辑帖子 GVillani82
  • 阅读:stackoverflow.com/a/42455515/3903847 如果不请求订阅者中的项目,您将无法获得 onNext,或者使用@GVillani82 指出的其他重载
  • 如果将 3 个输入替换为 Observable.just() 的模拟源,每个都返回一些默认值,它会起作用吗?

标签: android rx-android rx-java2 reactivex


【解决方案1】:

试试这个:

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");
            }
        });

【讨论】:

  • 仍然在 accept....menuName,restaurantName,userName 中转义断点
【解决方案2】:

尝试稍微改变你的代码:

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()+"");
}


}}

【讨论】:

  • 同样的问题。调试器只命中onSubscribe断点,跳出方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 2019-12-22
相关资源
最近更新 更多