收藏 分销(赏)

当Android遇上RxJava-By-宇行信.pptx

上传人:精**** 文档编号:5731710 上传时间:2024-11-17 格式:PPTX 页数:39 大小:2.84MB 下载积分:12 金币
下载 相关 举报
当Android遇上RxJava-By-宇行信.pptx_第1页
第1页 / 共39页
当Android遇上RxJava-By-宇行信.pptx_第2页
第2页 / 共39页


点击查看更多>>
资源描述
当Android遇上RxJavaBy 宇行信(yuxingxin)2016.1.10RxJava+Android1.介绍ReactiveX、RxJava2.常见Android开发中遇到的使用场景3.关于RxJava与Android的学习ReactiveX1.扩展的观察者模式通过订阅可观测对象的序列流然后做出反应。2.迭代器模式对对象序列进行迭代输出从而使订阅者可以依次对其处理。3.函数式编程思想简化问题的解决的步骤,让你的代码更优雅和简洁ReactiveX已经实现的语言版本和平台版本为什么说是扩展的观察者模式GoF中的观察者模式:被观察者发出事件,然后观察者(事件源)订阅然后进行处理。扩展:如果没有观察者,被观察者是不会发出任何事件的。另外知道事件何时结束,还有错误通知处理迭代器模式提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示RxJava Essentials一书做的的对比:迭代器模式在事件处理上采用的是“同步/拉式”的方式,而被观察者采用的是“异步/推式”的方式,而对观察者而言,显然后者更灵活。函数式编程来自给Android开发者的RxJava详解的代码:对比一下是不是下面更简洁与优雅?RxJava1.RxJava的核心2.RxJava操作符3.RxJava扩展RxJava核心Observable(被观察者,也就是事件源)和Subscriber(观察者)写成匿名函数:用Java 8 lambdas(Retrolambda)表达式ObservableOnSubscribeObserverSubscriptionSubscriber容易混淆的类/接口宝石图http:/ strings=张张三三,李四李四,王五王五,赵赵六六;Observable.from(strings).subscribe(new Action1()Override public void call(String s)Log.i(name,s););RxJava操作符变换操作:Map、FlatMap、ConcatMap等public void showUserName(String userName)textView.setText(userName);public void showUserName(String userName)Observable.just(userName).subscribe(new Action1()Override public void call(String s)textView.setText(s););如果需要在显示前对这个字符串做处理,然后再展示,比如加“张三,你好”方法1:我们可以对字符串本身操作方法2:我们可以放到Action1.call()方法里做处理方法3:使用操作符做变换:mappublic void showUserName(String userName)Observable.just(userName).map(new Func1()public String call(String text)return handleUserName(text);).subscribe(new Action1()public void call(String s)textView.setText(s););flatMap()打印出中国的所有省份名称。List provinceList=Observable.from(provinceList).map(new Func1()Override public String call(Province province)return province.getName();).subscribe(new Action1()Override public void call(String s)Log.i(“省份名称省份名称”,s);flatMap()打印出中国每个省份的所有城市List provinceList=Observable.from(provinceList).subscribe(new Action1()Override public void call(Province province)List cities=province.getCities();for(int i=0;i cities.size();i+)City city=cities.get(i);Log.i(“城市城市”,city.getName(););List provinceList=Observable.from(provinceList).flatMap(new Func1Province,Observable()Overridepublic Observable call(Province province)return Observable.from(province.getCities();).subscribe(new Action1()Override public void call(City city)Log.i(“城市城市”,city.getName(););flatMap()flatMap()扩展回调地狱restAdapter.getApiService().getToken(new Callback()Override public void success(String token)restAdapter.getApiService().getUserInfo(token,new Callback()Override public void success(UserInfo userInfo)showMessage(userInfo.getUser);Override public void failure(RetrofitError error)/处处理理错误错误 .);Override public void failure(RetrofitError error)/Error handling .);解决回调地狱restAdapter.getApiService().getToken().flatMap(new Func1String,Observable()Override public Observable call(String token)return restAdapter.getApiService().getUserInfo(token);).subscribe(new Action1()Override public void call(UserInfo userInfo)showMessage(userInfo.getUser);)异步调度器Scheduler:Schedulers.immediate()Schedulers.newThread()Schedulers.io()Sputation()AndroidSchedulers.mainThread()操作符:subscribeOn():指定 subscribe()所发生的线程observeOn():指定 Subscriber 所运行在的线程Schedulers.trampoline()修改之前的例子restAdapter.getApiService().getToken().flatMap(new Func1String,Observable()Override public Observable call(String token)return restAdapter.getApiService().getUserInfo(token);).subscribeOn(Schedulers.io()/指定指定 subscribe()发发生在生在 IO 线线程程.observeOn(AndroidSchedulers.mainThread()/指定指定 Subscriber 的的回回调发调发生在主生在主线线程程.subscribe(new Action1()Override public void call(UserInfo userInfo)showMessage(userInfo.getUser);)操作符复用 Observable applySchedulers(Observable observable)return observable.subscribeOn(Schedulers.io().observeOn(AndroidSchedulers.mainThread();applySchedulers(restAdapter.getApiService().getToken().flatMap(new Func1String,Observable()Override public Observable call(String token)return restAdapter.getApiService().getUserInfo(token);).subscribe(new Action1()Override public void call(UserInfo userInfo)showMessage(userInfo.getUser);)转换器与Compose()Transformer:Func1Observable,Observable Transformer applySchedulers()return new Transformer()Override public Observable call(Observable observable)return observable.subscribeOn(Schedulers.io().observeOn(AndroidSchedulers.mainThread();restAdapter.getApiService().getToken().flatMap(new Func1String,Observable()Override public Observable call(String token)return restAdapter.getApiService().getUserInfo(token);).compose(applySchedulers().subscribe(new Action1()Override public void call(UserInfo userInfo)showMessage(userInfo.getUser);)Compose()操作符其他操作符过滤操作:Debounce,Distinct,ElementAt,Filter,First,Last,Sample,Skip,SkipLast,Take,TakeLast等Debounce:“去抖”,只有在空闲了一段时间后才发射数据,过滤掉发射速率过快的数据项Sample:“采样”,定期发射Observable最近发射的数据项自定义操作符总结将一个为数字的字符串数组元素转换为数字过滤掉大于10的数字去重取最后面3个元素累计求和Observable .from(numbers).map(s-Integer.parseInt(s).filter(s-s number1+number2).subscribe(i-System.out.println(i);/16String numbers=11,2,2,13,4,5,7扩展1.Rxbinding:用RxJava实现onClick,TextWatcher,check等事件绑定2.RxBus:用RxJava实现EventBus或者Otto3.RxPreferences:用RxJava实现Android中的SharedPreferences4.RxLifecycle:用来严格控制由于发布了一个订阅后,由于没有及时取消,导致Activity/Fragment无法销毁导致的内存泄露。5.ReactiveNetwork:使用RxJava来监听网络连接状态和wifi信号强度变化6.RxPermissions:针对 Android 6.0 权限管理进行一个 Rx 封装的一个类库7.rxloader:用RxJava对loader的一个封装还有更多Android应用场景1.避免嵌套回调地狱问题2.使用debounce减少频繁的网络请求。避免每输入(删除)一个字就做一次联想3.使用combineLatest合并最近N个结点,注册的时候所有输入信息(邮箱、密码、电话号码等)合法才点亮注册按钮。4.使用merge合并两个数据源,最后做统一处理5.使用concat和first做缓存,依次检查memory、disk和network中是否存在数据,任何一步一旦发现数据后面的操作都不执行。6.使用timer做定时操作7.使用interval做周期性操作8.使用throttleFirst防止按钮重复点击9.做响应式的界面更多RxTextView.textChanges(searchEditText).debounce(150,MILLISECONDS).switchMap(Api:searchItems).subscribe(this:updateList,t-showError();Observable.merge(getNews(),getHotNews(),new Func2Response,MyResponse,Boolean()Override public Boolean call(Response response,Response response2)mData.clear();mData.addAll(response);mData.addAll(response2.msg);return true;).subscribeOn(Schedulers.io().observeOn(AndroidSchedulers.mainThread().subscribe(new Subscriber()Override public void onCompleted()Override public void onError(Throwable e)Override public void onNext(Boolean o)mAdapter.notifyDataSetChanged(););RxView.clicks(button).throttleFirst(1,TimeUnit.SECONDS).subscribe(new Observer()Override public void onCompleted()log.d(completed);Override public void onError(Throwable e)log.e(error);Override public void onNext(Object o)log.d(button clicked););SharedPreferences preferences=PreferenceManager.getDefaultSharedPreferences(this);RxSharedPreferences rxPreferences=RxSharedPreferences.create(preferences);Preference checked=rxPreferences.getBoolean(checked,true);CheckBox checkBox=(CheckBox)findViewById(R.id.cb_test);RxCompoundButton.checkedChanges(checkBox).subscribe(checked.asAction();Observable memory=Observable.create(new Observable.OnSubscribe()Override public void call(Subscriber subscriber)if(memoryCache!=null)subscriber.onNext(memoryCache);else subscriber.onCompleted(););Observable disk=Observable.create(new Observable.OnSubscribe()Override public void call(Subscriber subscriber)String cachePref=rxPreferences.getString(cache).get();if(!TextUtils.isEmpty(cachePref)subscriber.onNext(cachePref);else subscriber.onCompleted(););Observable network=Observable.just(network);/依次检查memory、disk、network Observable.concat(memory,disk,network).first().subscribeOn(Schedulers.newThread().subscribe(s-memoryCache=memory;System.out.println(-subscribe:+s););参考http:/gank.io/post/560e15be2dca930e00da1083http:/ Essentialshttp:/reactivex.io关于微博:宇行信移动开发在线分享站:http:/知乎:yuxingxinThanks
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服