Heim > Fragen und Antworten > Hauptteil
Bei der Verwendung von Rxjava gibt es möglicherweise bereits viele Funktionsrückrufe. Wie kann also ein Datenstrom basierend auf den Parametern dieser Funktionsrückrufe erstellt werden?
Wenn ich beispielsweise onKeyDown() ändern muss, wie kann ich eine bestimmte Folge von Benutzereingaben entsprechend den verschiedenen Tastenanschlägen verarbeiten, z. B. eine spezielle Verarbeitung, wenn der Benutzer „1, 2, 3, 4“ eingibt?
Oder wenn es andere Funktionsrückrufe gibt, wie verwendet man Operatoren wie bufferDebouncezip, um Daten aus diesen Funktionsrückrufen zu verarbeiten?
大家讲道理2017-05-16 13:30:50
可以这样写
private BehaviorSubject<Integer> bs;
private void testSeri() {
bs = BehaviorSubject.create();
//每3次 accept 一次
bs.buffer(3)
.subscribe(new Consumer<List<Integer>>() {
@Override
public void accept(@NonNull List<Integer> ints) throws Exception {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ints.size(); i++){
sb.append(ints.get(0));
}
Toast.makeText(TestSubjectActivity.this, sb.toString(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
bs.onNext(keyCode);
return super.onKeyDown(keyCode, event);
}
onKeyDown是Activity的回调,不方便再包装一层,因此用了Subject这种可以【随时随地】发射数据、订阅和发射方便分开写的发射器。对于一般的回调可以这样写,给你个百度定位的回调感受一下
class LocationObservable implements ObservableOnSubscribe<BDLocation> {
@Override
public void subscribe(final ObservableEmitter<BDLocation> e) throws Exception {
initLocation();
mLocationClient.registerLocationListener( new BDLocationListener(){
@Override
public void onReceiveLocation(BDLocation location) {
if (location != null) {
mLocationClient.stop();
if (!TextUtils.isEmpty(location.getCity())) {
e.onNext(location);
e.onComplete();
}
} else {
// 定位失败
e.onError(new Exception("百度地图 定位失败"));
}
}
} );
mLocationClient.start();
}
}
对于一般的函数,可以这样
Observable<String> o1 = Observable.fromCallable(new Callable<String>() {
@Override
public String call() {
return func1();
}
});
public String func1(){
return "ok";
}