Есть ли более чистый способ сделать следующее?
У меня есть Android-наблюдатель, который отклоняет запросы. onNext вызывает вторую наблюдаемую.
{// when creating the android activity
searchTextEmitterSubject = PublishSubject.create();
subscription = AndroidObservable.bindActivity(this, Observable.switchOnNext(searchTextEmitterSubject))
.debounce(100, TimeUnit.MILLISECONDS, Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.d("a",s);
pa.doSearch(s);
}
});
}
@OnTextChanged(R.id.ed)
public void onTextEntered(CharSequence charsEntered) {
searchTextEmitterSubject.onNext(getASearchObservableFor(charsEntered.toString()));
}
private Observable<String> getASearchObservableFor(final String searchText) {
return Observable.create( (Subscriber<? super String> subscriber) ->
subscriber.onNext(searchText)).subscribeOn(Schedulers.io());
}
doSearch создает второй наблюдаемый объект:
public void doSearch(String string) {
AlbumEndpoint albumEndpoint = API.getRestAdapter().create(AlbumEndpoint.class);
Observable<Point> observable = albumEndpoint.searchPoint(string);
mAdapterDataSubscription = AndroidObservable.bindActivity((Activity) getContext(), observable)
.subscribe(mAdapterDataObserver);
}
private Observer<Point> mAdapterDataObserver = new Observer<Point>() {
@Override
public void onCompleted() {
mAdapterDataSubscription.unsubscribe();
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(Point point) {
List<Point.Result> results = point.getResults();
mData.addAll(results);
notifyDataSetChanged();
}
};
Оно работает. Но есть ли способ «слить» два потока в один либо для улучшения читаемости, либо для создания наиболее оптимального кода?
Изменить: для полноты картины и для всех, кто интересуется будущим, мне удалось сократить код до:
Observable<EditText> searchTextObservable = ViewObservable.text(ed);
searchTextObservable.debounce(100, TimeUnit.MILLISECONDS)
.flatMap(editText -> {
String string = editText.getText().toString();
AlbumEndpoint albumEndpoint = getRestAdapter().create(AlbumEndpoint.class);
return albumEndpoint.searchPoint(string);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mAdapterDataObserver);
RestAdapter
, и сам адаптер должен быть Singletone, поскольку Джейк говорит. Таким образом, создание нового экземпляра при каждом отказе — пустая трата времени. - person Dmitry Gryazin   schedule 03.02.2015