Я использую RxJava для перемещения доступа к сети в отдельный поток на Android, но мой пользовательский интерфейс все еще блокируется.Блокировка пользовательского интерфейса происходит в Android, несмотря на RxJava
Я не использую неправильно наблюдаемые, как показано здесь: Android RxJava, Non Blocking?
В кодовых [A], [B] и [C] в поле ниже коде передаются в порядке [A] -> [C] - > [B], поэтому текущий поток обрабатывается штрафом, а RxJava вызывает [C], как только он получил результат. Это отлично.
Кроме того, блокировка намного лучше по сравнению с выполнением сетевого вызова в потоке пользовательского интерфейса, но у меня все еще есть небольшая блокировка. Пользовательский интерфейс остается свободным после вызова, но если сервер не отвечает за миллисекунды, он блокируется.
private search; // search is an instance variable in the same class
// [A]
Observable.just(search.find("something")) // search.find calls the REST endpoint
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Search>() {
@Override public void call(Search search) {
// further processing // [B]
}
}, new Action1<Throwable>() {
@Override public void call(Throwable throwable) {
// error handler
}
});
// [C]
Может быть проблема, что поиск является переменным экземпляром в том же классе, где Наблюдаемые использует его, но вызов конечной точки выполняется из отдельной библиотеки? Это не имеет значения, не так ли?
Я делаю что-нибудь плохое, чего я не должен делать?
-
Поиск выглядит следующим образом (удалены обработки исключений для краткости):
public Search find(String searchtext) {
setSearchtext(searchtext);
SearchEndpoint.find(Session.getUser().getId(), searchtext);
return this;
}
SearchEndpoint как это:
public static Search find(final Long userId, final String searchtext) throws IOException {
return ApiService.api().searches().find(userId).setFind(searchtext).execute();
}
и делает вызов сгенерированного Google облака конечной точки библиотека.
Не могли бы вы разместить дополнительную информацию о методе search.find? Я полагаю, что его тип возврата - это поиск, и это простой синхронный вызов метода? В этом случае just() вызовет search.find(), блокирует до тех пор, пока не вернет значение, а затем обернет это значение в наблюдаемое, которое немедленно вызовет onNext, а затем onCompleted. Вместо этого: либо используйте RetroFit, либо посмотрите на Observable.create, чтобы правильно обернуть ваш вызов REST в Observable ...Спросите еще раз, если вам нужна дополнительная помощь! –