android - Bagaimana untuk membuat Observable berdasarkan fungsi atau panggilan balik fungsi sedia ada dalam RxJava?
怪我咯
怪我咯 2017-05-16 13:28:50
0
1
748

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?

怪我咯
怪我咯

走同样的路,发现不同的人生

membalas semua(1)
大家讲道理

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";
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan