Во-первых, извините за поздний ответ, я просто застрял с той же проблемой, и, используя информацию со многих сайтов, я сделал успешную подписку.
Когда вы настраиваете свой ApolloClient, вам нужночтобы определить некоторые дополнительные параметры:
Первый - это нормализованный кеш, для этого я использую конфигурацию по умолчанию:
NormalizedCacheFactory normalizedCacheFactory(){
return new LruNormalizedCacheFactory(EvictionPolicy.builder().maxSizeBytes(10 * 1024).build());
}
И cacheKeyResolver:
CacheKeyResolver cacheKeyResolver(){
return new CacheKeyResolver() {
@Nonnull
@Override
public CacheKey fromFieldRecordSet(@Nonnull ResponseField field, @Nonnull Map<String, Object> recordSet) {
if (recordSet.containsKey("id")) {
String id = (String) recordSet.get("id");
return CacheKey.from(id);
}
return CacheKey.NO_KEY;
}
@Nonnull @Override
public CacheKey fromFieldArguments(@Nonnull ResponseField field, @Nonnull Operation.Variables variables) {
return CacheKey.NO_KEY;
}
};
}
В cacheKeyResolver вам нужно указать, как будут идентифицироваться идентификаторы ваших объектов, в моем случае все они содержат «id» в начале своего имени.Вы можете добавить больше параметров, используя ту же структуру.
Оба эти конфига находятся внутри компоновщика ApolloClient:
Map<String, Object> connectionParams = new HashMap<>();
return ApolloClient.builder()
.serverUrl(urlBaseDeDatos)
.normalizedCache(normalizedCacheFactory(),cacheKeyResolver())
.okHttpClient(okHttpClient())
.subscriptionConnectionParams(connectionParams)
.subscriptionTransportFactory(new WebSocketSubscriptionTransport.Factory(urlBaseDeDatos, okHttpClient()))
.build();
Последние 2 являются важными, так как они контролируют вашу подписку (илиЯ думаю, что они делают), как только я определил эти 2, я мог бы сделать подписку.Мои connectionParams пусты, так как я не использую токен аутентификации или что-то в этом роде.
Теперь для подписки:
private Flowable<Response<TaskStatusChangedSubscription.Data>> subscription(){
apolloClient.clearNormalizedCache();
return Rx2Apollo.from(apolloClient.subscribe(TaskStatusChangedSubscription
.builder()
.build()));
}
Обычный поток с методом Apollo.subscribe инекоторая помощь от RxJava и выполнение .subscribe () для той же функции или для другой (например, одноразовой).
Наконец (извините за все объяснения из ранее, но это может помочь кому-то еще), вашпроблема должна быть решена, если вы измените свой Apollo Builder на это:
Map<String, Object> connectionParams = new HashMap<>();
ApolloClient mApolloClient = ApolloClient.builder().serverUrl(ENDPOINT).okHttpClient(ohc).subscriptionConnectionParams(connectionParams)
.subscriptionTransportFactory(new WebSocketSubscriptionTransport.Factory(ENDPOINT, okHttpClient()))
.build();