在使用Rxjava過程中,可能已經有很多函數回調,那麼要怎麼根據這些函數回調的參數來建立資料流? 例如如果我需要改造onKeyDown(),那麼怎麼根據傳來按鍵的不同,處理特定用戶輸入的序列,例如用戶輸入「1,2,3,4」的時候做特殊處理。
或是有其他的函數回調,怎麼將這些函數回呼的資料使用bufferDebouncezip等操作符處理資料?
走同样的路,发现不同的人生
可以這樣寫
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"; }
可以這樣寫
onKeyDown是Activity的回調,不方便再包裝一層,因此用了Subject這種可以【隨時隨地】發射數據、訂閱和發射方便分開寫的發射器。對於一般的回調可以這樣寫,給你個百度定位的回調感受一下
對於一般的函數,可以這樣