搜尋

首頁  >  問答  >  主體

android - RxJava中如何根據現有的函數或函數回呼創建Observable?

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

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

怪我咯怪我咯2784 天前777

全部回覆(1)我來回復

  • 大家讲道理

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

    回覆
    0
  • 取消回覆