मैं आपके कोड को दोबारा कैसे सुधारूंगा;
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);
}
});
}
});
}
या जावा 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);
}
})
);
}
अब आप कॉलबैक के एक साथ एक आरएक्स एपीआई उजागर हो GetData विधि के साथ-साथ, मैं GetData विधि एक एकल के रूप में लिपटे जोड़ना होगा। यह अपने खुद के dataProvider किसी तरह का है मान, अब आप कॉलबैक के साथ काम कर इस तरह के बिना इसका इस्तेमाल कर सकते हैं:
dataProvider.getDataSingle()
.map(result -> result ? "User exist" : "User doesn't exist")
.subscribe(message -> display(message));
मैं RX2 थे, लेकिन तर्क RX1 के साथ एक ही है।
मैंने एक पर्यवेक्षण के बजाय Single का भी उपयोग किया, क्योंकि आप केवल एक मान का इंतजार कर रहे हैं। ब्याज आपके कार्य के लिए एक अधिक अभिव्यक्तिपूर्ण अनुबंध है।
आप एक पर्यवेक्षक की तरफ से मूल्य उत्सर्जित नहीं कर सकते हैं, यानी myObservable.send (value) जैसे कुछ कॉल कर सकते हैं। पहला समाधान Subject का उपयोग करना है। एक और समाधान (उपर्युक्त) पर्यवेक्षण योग्य() (या एकल .create()) के साथ देखने योग्य है। आप कॉलबैक विधि को कॉल करते हैं और विधि Observable.create() के अंदर श्रोता बनाते हैं, क्योंकि यह Observable.create() के अंदर है जिसे आप स्यूसे() विधि पर कॉल कर सकते हैं, जिस विधि ने अवलोकन करने योग्य को मूल्य को पास करने के लिए कहा था।
मैं कॉलबैक को देखने योग्य में लपेटने के लिए उपयोग करता हूं। पहले थोड़ा जटिल, लेकिन अनुकूलित करने में आसान है।
मैं आपको एक और उदाहरण देता हूं, जैसा कि पूछा गया था।
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 –