Как использовать оператор RxJava combLatest с более чем 9 наблюдаемыми
Я использую RxJava, и я хочу объединить 12 различных наблюдаемых с помощью оператора combineLatest
.
Я видел прототип функции, который принимает список наблюдаемых и реализацию FuncN
, но я не уверен, как это сделать, у меня возникают проблемы с внедрением метода call
.
Может ли кто-нибудь показать мне пример?
Ответы
Ответ 1
Существует combineLatest
, который принимает List
наблюдаемых. Вот пример того, как его использовать:
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;
}
});
Ответ 2
Расширяйте этот ответ, я использую его для одновременного чтения нескольких характеристик, это можно сделать так:
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);
}
Комментарии, если у вас есть предложения по улучшению этого процесса.
Ответ 3
RxKotlin поддерживает до 9 операторов в параметрах в методе combLatest(), но использование более 9 параметров означает передачу неограниченного динамического массива пользовательских объектов, который вы можете использовать, как показано ниже:
Сначала позвольте мне привести простой пример с двумя параметрами с пользовательскими типами данных.
val name = Observable.just("MyName")
val age = Observable.just(25)
Observables.combineLatest(name, age) { n, a -> "$n - age:${a}" }
.subscribe({
Log.d("combineLatest", "onNext - ${it}")
})
А что если я хочу передать несколько параметров в сочетании с последним? Тогда ваш ответ будет ниже: (я использовал пользовательские типы данных, поэтому чью-то пользовательскую проблему также можно решить здесь)
val myList = arrayOf(Observable.just("MyName"),
Observable.just(2),
Observable.just(3.55),
Observable.just("My Another String"),
Observable.just(5),
Observable.just(6),
Observable.just(7),
Observable.just(8),
Observable.just(9),
Observable.just(10),
Observable.just(11),
Observable.just(12),
Observable.just(13),
Observable.just(14),
Observable.just(15))
Observable.combineLatest(myList, {
val a = it[0] as String
val b = it[1] as Int
val c = it[2] as Float
val d = it[3] as String
val e = it[4] as Int
val f = it[5] as Int
val g = it[6] as Int
val h = it[7] as Int
val i = it[8] as Int
val j = it[9] as Int
val k = it[10] as Int
val l = it[11] as Int
val m = it[12] as Int
"$a - age:${b}" })
.subscribe({
Log.d("combineLatest", "onNext - ${it}")
})
Ответ 4
из кода выше. замените каждую строку
rxBleConnection.readCharacteristic(UUID...),
с
rxBleConnection.readCharacteristic(UUID...).onErrorResumeNext { bytes -> Observable.just(new byte[0])) },
По сути, вы возвращаете пустой массив байтов, если не найден какой-либо признак. код продолжит
Ответ 5
Я использую RxJava и хочу объединить 12 различных наблюдаемых с помощью оператора combLatest.
Я видел прототип функции, который принимает список наблюдаемых и реализацию. но я не уверен, как это сделать, у меня возникли проблемы с реализацией метода вызова. Пожалуйста, проверьте мой код и сделайте все необходимое.
Поток> получить города => _citiesController.stream;
Поток get city => _cityController.stream;
Поток get agentcity => _agentcityController.stream;
Поток get userpackages => _packagesController.stream;
Поток получить электронную почту => _emailController.stream.transform(validateEmail);
Поток get firstName => _firstNameController.stream.transform(validateFirstName);
Поток get lastName => _lastNameController.stream.transform(validateLastName);
Поток get mobileNumber => _mobileNumberController.stream.transform(validateMobile);
Поток get dob => _dobController.stream.transform(validatedob);
Поток get assigndate => _appointmentdateController.stream.transform(validateappointmentDate);
Поток get pincode => _pincodeController.stream.transform(validatePincode);
Поток получить пол => _genderController.stream;
Поток get address => _addressController.stream.transform(validateAddress);
Поток get agentname => _agentnameController.stream.transform(validateAgentName);
Поток get validSubmission => Observable.combineLatest9 (
email,
firstName,
mobileNumber,
pincode,
dob,
address,
agentname,
_genderController.stream,
_cityController.stream,
_agentcityController.stream,
_packagesController.stream,
_appointmentdateController.stream,
(e, f, m, p, d, a, an, g, c, ac, pc, ad) => true,
);
Пожалуйста, дайте мне знать, как использовать объединить последние в моем коде с Flutter