RxJava:打开会话,执行查询和关闭会话

时间:2016-03-22 16:29:23

标签: rx-java

我是Rx的新手,我正在尝试创建一个Observable:

  1. 请求令牌
  2. 使用此令牌创建请求并对第三方服务执行查询
  3. 使用令牌
  4. 关闭会话

    我有这个:

    public Observable<List<City>> getCities() {
    
        authService.requestToken() //return Observable<String>
            .concatMap(new Func1<String, Observable<? extends List<City>>>() {
              @Override
              public Observable<? extends List<City>> call(String token) {
                  CitiesRequest request = new CitiesRequest(token);
                  return soapClient.consume(request).map(new CityResponseParseFunc());                    }
            })
            //Here, I need close the session using the token. Maybe with doOnCompleted?
    }
    

    我不知道它是否正确,不知道如何继续。请注意,我需要该方法返回Observable<List<City>>。这可能吗?

    感谢。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果requestToken()只发出一个值,您可以为concatMap切换flatMap并使用此重载版本:

authService.requestToken() //return Observable<String>
        .flatMap(new Func1<String, Observable<? extends List<City>>>() {
            @Override
            public Observable<? extends List<Integer>> call(String token) {
                CitiesRequest request = new CitiesRequest(token);
                return soapClient.consume(request).map(new CityResponseParseFunc());
            }
        }, new Func2<String, List<City>, List<City>>() {
            @Override
            public List<City> call(String token, List<City> cities) {
                authService.closeSession(token)
                return cities; /*close session with token*/
            }
        })

答案 1 :(得分:1)

您可以使用using运算符。它需要3个函数作为参数:

  1. 创建/获取要使用的资源的Func0<Resource>(此处为令牌)。
  2. Func1<Resource, Observable<T>>创建Observable<T>,使用资源(此处为我们的城市列表的Observable)。
  3. 处置函数Action1<Resource>,它将在Observable<T>生命周期结束时处置资源。
  4. 由于您的authService似乎返回Observable<String>,因此它可以使using运算符的使用稍微复杂一些,特别是对于dispose函数(需要缓存资源{{ 1}}以便订阅它的dispose函数不会重新生成令牌。另一种方法是同步获取令牌。

    这样的事情:

    Observable<String>