android - RxJava中如何根據現有的函數或函數回呼創建Observable?
怪我咯
怪我咯 2017-05-16 13:28:50
0
1
767

在使用Rxjava過程中,可能已經有很多函數回調,那麼要怎麼根據這些函數回調的參數來建立資料流?
例如如果我需要改造onKeyDown(),那麼怎麼根據傳來按鍵的不同,處理特定用戶輸入的序列,例如用戶輸入「1,2,3,4」的時候做特殊處理。

或是有其他的函數回調,怎麼將這些函數回呼的資料使用bufferDebouncezip等操作符處理資料?

怪我咯
怪我咯

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

全部回覆(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";
}
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板