Is there any cleaner way to do the following?
I have a Android observable that debounces the requests. onNext it calls a second observable.
{// 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 instantiates a second observable:
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();
}
};
It works. But is there a way to "merge" the two streams into one either improving readability or to create a most optimal code?
Edit: For sake of completeness and anyone interested in the future I manage to shrink the code into:
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);