android - Wie erstelle ich ein Observable basierend auf einer vorhandenen Funktion oder einem Funktionsrückruf in RxJava?
怪我咯
怪我咯 2017-05-16 13:28:50
0
1
733

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?

怪我咯
怪我咯

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

Antworte allen(1)
大家讲道理

可以这样写

    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";
}
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!