Rumah > Soal Jawab > teks badan
Dalam proses menggunakan Rxjava, mungkin sudah terdapat banyak panggilan balik fungsi, jadi bagaimana untuk mencipta aliran data berdasarkan parameter panggilan balik fungsi ini?
Sebagai contoh, jika saya perlu mengubah suai onKeyDown(), bagaimana saya boleh memproses urutan tertentu input pengguna mengikut ketukan kekunci yang berbeza, seperti pemprosesan khas apabila pengguna memasukkan "1, 2, 3, 4".
Atau jika terdapat panggilan balik fungsi lain, bagaimana untuk menggunakan operator seperti bufferDebouncezip untuk memproses data daripada panggilan balik fungsi ini?
大家讲道理2017-05-16 13:30:50
Anda boleh menulis seperti ini
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 ialah panggilan balik Activity Menyusahkan untuk membungkusnya dalam lapisan lain, jadi kami menggunakan Subject, yang boleh menghantar data [bila-bila masa dan di mana-mana], melanggan dan menghantar dengan mudah dan menulis secara berasingan. Untuk panggilan balik umum, anda boleh menulisnya seperti ini. Biar saya rasakan panggilan balik yang diletakkan oleh 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();
}
}
Untuk fungsi umum, anda boleh melakukan ini
Observable<String> o1 = Observable.fromCallable(new Callable<String>() {
@Override
public String call() {
return func1();
}
});
public String func1(){
return "ok";
}