web-dev-qa-db-fra.com

Comment utiliser l'opérateur RxJava combineLatest avec plus de 9 observables

J'utilise RxJava et je souhaite combiner 12 observables différentes à l'aide de l'opérateur combineLatest

J'ai vu un prototype de fonction qui prend une liste d'observables et une implémentation de FuncN mais je ne sais pas comment procéder, j'ai du mal à implémenter la méthode call.

Quelqu'un peut-il me montrer un exemple?

10
user3762200

Il y a une combineLatest qui prend une List d'observables. Voici un exemple d'utilisation:

List<Observable<?>> list = Arrays.asList(Observable.just(1), Observable.just("2"));
Observable.combineLatest(list, new FuncN<String>() {
    @Override
    public String call(Object... args) {
        String concat = "";
        for (Object value : args) {
            if (value instanceof Integer) {
                concat += (Integer) value;
            } else if (value instanceof String) {
                concat += (String) value;
            }
        }
        return concat;
    }
});
18
Egor Neliuba

Vous développez cette réponse, je l'utilise pour lire plusieurs caractéristiques à la fois, vous pouvez le faire comme suit:

connectionObservable
                .flatMap((Func1<RxBleConnection, Observable<?>>) rxBleConnection -> {
                    List<Observable<?>> list1 = Arrays.asList(
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...),
                            rxBleConnection.readCharacteristic(UUID...));
                    return Observable.combineLatest(list1, args -> {
                       Object o =  doSomethingWithResults(args);
                        return o;
                    });
                })
                .observeOn(AndroidSchedulers.mainThread())
                .doOnUnsubscribe(this::clearConnectionSubscription)
                .subscribe(retVal -> {
                    Log.d(TAG, "result:" + retVal.toString());
                    Log.w(TAG, "SUCCESS");
                    triggerDisconnect();

                }, MyActivity.this::onReadFailure);
    }

Commentaires si vous avez des suggestions pour améliorer ce processus.

5
TacoEater

à partir du code ci-dessus. remplacer chaque ligne

rxBleConnection.readCharacteristic(UUID...),

avec

rxBleConnection.readCharacteristic(UUID...).onErrorResumeNext { bytes -> Observable.just(new byte[0])) },

essentiellement, vous retournez un tableau d'octets vide si une certaine caractéristique n'est pas trouvée. le code continuera

0
DarthHater