suchen

Heim  >  Fragen und Antworten  >  Hauptteil

android - Wie erstelle ich ein Observable basierend auf einer vorhandenen Funktion oder einem Funktionsrückruf in RxJava?

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?

怪我咯怪我咯2784 Tage vor774

Antworte allen(1)Ich werde antworten

  • 大家讲道理

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

    Antwort
    0
  • StornierenAntwort