Python中文网

一个关于 编程问题的解答网站.

有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java对一个可观察的资源应用一个单一变量,而不是过度阅读

一般来说,我对RX很陌生,尤其是rxjava,请原谅我的错误

此操作依赖于两个异步操作

第一种方法使用过滤器函数尝试从异步可观察对象返回的列表中获取单个实体

第二种是异步操作,它与设备通信,并生成可观察的状态更新

我想从filter函数中创建一个,将其应用到pairReader(...),并订阅它的Observable进行更新。我可以让它如图所示工作,但前提是我包含了take(1)注释,否则我会得到一个异常,因为链试图从单个值中提取另一个值

  Observable<DeviceCredential> getCredentials() {
    return deviceCredentialService()
            .getCredentials()
            .flatMapIterable(event -> event.getData());
  }

  Single<Organization> getOrgFromCreds(String orgid) {
    return getCredentials()
      // A device is logically constrained to only have a single cred per org
      .map(DeviceCredential::getOrganization)
      .filter(org -> org.getId().equals(orgid))
      .take(1)  // Without this I get an exception
      .singleOrError();
  }

  Function<Organization, Observable<Reader.EnrollmentState>> pairReader(String name) {
    return org -> readerService().pair(name, org);
  }

getOrgFromCreds(orgid)
  .flatMapObservable(pairReader(readerid))
  .subscribe(state -> {
     switch(state) {
       case BEGUN:
         LOG.d(TAG, "Pairing begun");
         break;
       case PAIRED:
         LOG.d(TAG, "Pairing success");
         callback.success();
         break;
       case NOTIFIED_SERVER:
         LOG.d(TAG, "Pairing server notified");
         break;
     }},
     error -> {
       Crashlytics.logException(error);
       callback.error(error.getLocalizedMessage());
     });

共 (2) 个答案

  1. # 1 楼答案

    如果源流发出多个项,singleOrError()应该发出一个错误Doc

    对于您的情况,请使用first()firstOrError()

      Single<Organization> getOrgFromCreds(String orgid) {
        return getCredentials()
          .map(DeviceCredential::getOrganization)
          .filter(org -> org.getId().equals(orgid))
          .firstOrError();
      }
    
    
  2. # 2 楼答案

    这里的问题是,API的设计方式很奇怪(不幸的是,它的文档非常糟糕)。我不明白为什么我会得到重复的,我认为我用错了flatMapIterable

    deviceCredentialService.getCredentials()调用实际创建的是一个可观察对象,它发出DataEvent对象,这些对象是结果列表上的简单包装器,并带有结果来源的标志

    API设计器希望允许用户在执行对REST API的较长请求时,使用本地缓存的数据立即填充UI。DataEvent.from属性是一个枚举,用于标记来自本地设备缓存或远程API调用的源

    我解决这个问题的方法是忽略来自本地缓存的结果,只从API发出结果:

      Observable<DeviceCredential> getCredentials() {
        return deviceCredentialService()
          .getCredentials()
          // Only get creds from network
          .filter(e -> e.getFrom() == SyncedDataSourceObservableFactory.From.SOURCE)
          .flatMapIterable(e -> e.getData());
      }
    
      Single<Organization> getOrgFromCreds(String orgid) {
        return getCredentials()
          // A device is logically constrained to only have a single cred per org
          .map(DeviceCredential::getOrganization)
          .filter(org -> org.getId().equals(orgid))
          .singleOrError();
      }
    

    然后,计划是使用memonization来缓存实体,让实现应用程序能够访问缓存失效。由于所提供的接口不允许压制API调用,因此如果应用程序觉得它是新的,就无法仅使用缓存