Как я буду реорганизовать ваш код; наряду с методом GetData, я хотел бы добавить метод GetData обернутый как Single:
public void getData(final OnResponseListener listener){
if(data!=null && !data.isEmpty()){
listener.onSuccess();
}
else{
listener.onError();
}
}
public Single<Boolean> getDataSingle() {
return Single.create(new SingleOnSubscribe<Boolean>() {
@Override
public void subscribe(SingleEmitter<Boolean> e) throws Exception {
getData(new OnResponseListener() {
@Override
public void onSuccess() {
e.onSuccess(true);
}
@Override
public void onError() {
e.onSuccess(false);
}
});
}
});
}
Или с Java 8:
public Single<Boolean> getDataSingle() {
return Single.create(e -> getData(
new OnResponseListener() {
@Override
public void onSuccess() {
e.onSuccess(true);
}
@Override
public void onError() {
e.onSuccess(false);
}
})
);
}
Теперь вы выставили API Rx наряду с одной функции обратного вызова в. Предположив, что это какой-то DataProvider свой собственный, теперь вы можете использовать его без решения обратных вызовов, например:
dataProvider.getDataSingle()
.map(result -> result ? "User exist" : "User doesn't exist")
.subscribe(message -> display(message));
Я использовал Rx2 но Прм1 логика та же.
Я также использовал Single вместо наблюдаемого, так как вы ожидаете только одного значения. Интерес представляет собой более выразительный контракт для вашей функции.
Вы не можете испускать ценность от имени наблюдаемого, то есть вызывать что-то вроде myObservable.send (значение). Первое решение - использовать Subject. Другое решение (выше) заключается в создании наблюдаемого с помощью Observable.create() (или Single.create()). Вы вызываете метод обратного вызова и создаете слушателя внутри метода Observable.create(), потому что он находится внутри Observable.create(), который вы можете вызвать методом onSuccess(), метод, который сказал Observable передать значение.
Это то, что я использую для привязки обратного вызова к наблюдаемому. Сначала немного сложно, но легко адаптироваться.
Я даю вам еще один пример, как и было задано. Допустим, вы хотите, чтобы отобразить изменения в EditText как закусочная:
View rootView;
EditText editTextView;
//Wrap Android addTextChangedListener into an Observable
Observable<String> textObservable = Observable.create(consumer ->
editTextView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
consumer.onNext(s.toString());
}
})
);
//Use it
textObservable.subscribe(text -> Snackbar.make(rootView, text, Snackbar.LENGTH_SHORT).show());
Смотрите эту связанный ответ: http://stackoverflow.com/a/41870888/697313 –