android - RxJava中如何根據已有的函數或函數回調創建Observable?
問題描述
在使用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> {@Overridepublic void subscribe(final ObservableEmitter<BDLocation> e) throws Exception { initLocation(); mLocationClient.registerLocationListener( new BDLocationListener(){@Overridepublic 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';}
相關文章:
1. java題目 任意一個字符串 倒置輸出,保持單詞的完整性2. javascript - 關于Lazyload遇到的問題3. angular.js - react的redux和vue的vuex,angular呢4. javascript - 如果根據參數給table中的tr綁定不同事件5. 算法 - python 給定一個正整數a和一個包含任意個正整數的 列表 b,求所有<=a 的加法組合6. WEB-INF / classes /與WEB-INF / lib / *。jar在類路徑優先級?7. c++ - 如何正確的使用QWebEngineView?8. java - 我在用Struts2上傳文件時,報以下錯誤怎么回事?9. javascript - 游戲里物體角色層次渲染邏輯和代碼怎么寫才好?10. javascript - js 寫一個正則 提取文本中的數據
