Maison > Questions et réponses > le corps du texte
Dans le processus d'utilisation de Rxjava, il peut déjà y avoir de nombreux rappels de fonctions, alors comment créer un flux de données basé sur les paramètres de ces rappels de fonctions ?
Par exemple, si je dois modifier onKeyDown(), comment puis-je traiter une séquence spécifique de saisie utilisateur en fonction des différentes frappes au clavier, comme un traitement spécial lorsque l'utilisateur saisit "1, 2, 3, 4".
Ou s'il existe d'autres rappels de fonctions, comment utiliser des opérateurs tels que bufferDebouncezip pour traiter les données de ces rappels de fonctions ?
大家讲道理2017-05-16 13:30:50
Vous pouvez écrire comme ça
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 est le rappel d'Activity. Il n'est pas pratique de l'envelopper dans une autre couche, nous utilisons donc Subject, qui peut transmettre des données [à tout moment et n'importe où], s'abonner et transmettre facilement et écrire séparément. Pour les rappels généraux, vous pouvez l'écrire comme ceci. Laissez-moi vous donner une idée des rappels positionnés par Baidu
. 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();
}
}
Pour les fonctions générales, vous pouvez faire ceci
Observable<String> o1 = Observable.fromCallable(new Callable<String>() {
@Override
public String call() {
return func1();
}
});
public String func1(){
return "ok";
}