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. mysql sql where id in(25,12,87) 结果集如何用按照 25 12 87排序?2. windows-7 - Win7中Vmware Workstatoin与Xampp中Apache服务器端口冲突?3. javascript - chart.js如何修改某个指定bar的颜色4. 网页爬虫 - python爬虫用BeautifulSoup爬取<s>元素并写入字典,但某些div下没有这一元素,导致自动写入下一条,如何解决?5. mysql中datetime列如何做筛选?6. javascript - AJAX请求疑问句7. angular.js使用$resource服务把数据存入mongodb的问题。8. javascript - 图片请求失败怎么去掉左上角的小图标?9. mysql - phpMyAdmin无法导入数据10. javascript - vue中input的blur影响了下拉的点击事件如何解决

网公网安备