Rumah  >  Soal Jawab  >  teks badan

android - Bagaimana untuk membuat Observable berdasarkan fungsi atau panggilan balik fungsi sedia ada dalam RxJava?

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?

怪我咯怪我咯2734 hari yang lalu742

membalas semua(1)saya akan balas

  • 大家讲道理

    大家讲道理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";
    }

    balas
    0
  • Batalbalas