UDN-企业互联网技术人气社区

板块导航

浏览  : 938
回复  : 0

[讨论交流] RxJava系列7(最佳实践)

[复制链接]
舞操的头像 楼主
发表于 2017-1-6 11:07:12 | 显示全部楼层 |阅读模式
 
  前言

  有点标题党了,其实谈不上什么最佳实践。前段时间公司实行996,所以也没什么时间和精力来更新博客(好吧~我承认是我懒~)。因此这篇文章只是简单的通过两个例子介绍了RxJava在生产环境中的使用。不过本篇中的每个例子我都配上了完整的代码。

  按照计划这一期是要介绍RxJava框架结构和设计思想的,但是考虑到Netflix将在十月底发布RxJava2.0正式版;因此决定将RxJava框架结构和设计思想分析放到2.0正式版发布后再做。后续我也会有一系列的文章来介绍RxJava1.x和2.x的区别。

  示例一、获取手机上已安装的App

  第一个例子我们需要在Android设备上展示已安装的第三方app列表,关于环境搭建、依赖配置、RecyclerView的使用等这些基础内容我就不做陈述了。需要了解的同学可以去GitHub上把项目clone下来看看。这里我主要讲讲如何通过RxJava实现核心功能。

  首选我们需要调用系统API来获取所有已安装的app,所以在OnSubscribe的call方法中调用getApplicationInfoList()。但是getApplicationInfoList()获取的数据并不能完全满足我们的业务需求:

  由于我们只需要展示手机上已安装的第三方App,因此需要通过filter操作符来过滤掉系统app;

  ApplicationInfo并不是我们所需要的类型,因此需要通过map操作符将其转换为AppInfo;

  由于获取ApplicationInfo、过滤数据、转换数据相对比较耗时,因此需要通过subscribeOn操作符将这一系列操作放到子线程中来处理;

  而要将信息展示在页面上涉及到UI操作,因此需要通过observeOn操作符将onNext、onCompleted、onError调度到主线程,接着我们在这些方法中更新UI。

  下面是核心代码:

  1.   final PackageManager pm = MainActivity.this.getPackageManager();

  2.   Observable.create(new Observable.OnSubscribe() {

  3.   @Override

  4.   public void call(Subscriber subscriber) {

  5.   List infoList = getApplicationInfoList(pm);

  6.   for (ApplicationInfo info : infoList) {

  7.   subscriber.onNext(info);

  8.   }

  9.   subscriber.onCompleted();

  10.   }

  11.   }).filter(new Func1() {

  12.   @Override

  13.   public Boolean call(ApplicationInfo applicationInfo) {

  14.   return (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0;

  15.   }

  16.   }).map(new Func1() {

  17.   @Override

  18.   public AppInfo call(ApplicationInfo applicationInfo) {

  19.   AppInfo info = new AppInfo();

  20.   info.setAppIcon(applicationInfo.loadIcon(pm));

  21.   info.setAppName(applicationInfo.loadLabel(pm).toString());

  22.   return info;

  23.   }

  24.   }).subscribeOn(Schedulers.io())

  25.   .observeOn(AndroidSchedulers.mainThread())

  26.   .subscribe(new Subscriber() {

  27.   @Override

  28.   public void onCompleted() {

  29.   mAppListAdapter.notifyDataSetChanged();

  30.   mPullDownSRL.setRefreshing(false);

  31.   }

  32.   @Override

  33.   public void onError(Throwable e) {

  34.   mPullDownSRL.setRefreshing(false);

  35.   }

  36.   @Override

  37.   public void onNext(AppInfo appInfo) {

  38.   mAppInfoList.add(appInfo);

  39.   }

  40.   });
复制代码


  程序执行效果图:

a.png


  完整的代码我放到了GitHub上,有兴趣大家可以去clone下来自己运行看看。

  源码地址:https://github.com/BaronZ88/HelloRxAndroid

  示例二、RxJava+Retrofit2实现获取天气数据

  RxJava + Retrofit2几乎是Android应用开发的标配了,这个例子中我们就来聊聊这二者是如何配合起来帮助我们快速开发的。

  Retrofit2中一个标准的接口定义是这样的:

 
  1.  @GET("weather")

  2.   Observable getWeather(@Query("cityId") String cityId);
复制代码


  现在有了RxJava,一个基本的网络请求我们便可以这样实现:

  1.   ApiClient.weatherService.getWeather(cityId)

  2.   .subscribeOn(Schedulers.io())

  3.   .observeOn(AndroidSchedulers.mainThread())

  4.   .subscribe(new Action1() {

  5.   @Override

  6.   public void call(Weather weather) {

  7.   weatherView.displayWeatherInformation(weather);

  8.   }

  9.   });
复制代码


  但有时候可能一开始我们并不知道cityId,我们只知道cityName。所以就需要我们先访问服务器,拿到对应城市名的cityId,然后通过这个cityId再去获取天气数据。

  同样的,我们需要定义一个获取cityId的接口:

 
  1.  @GET("city")

  2.   Observable getCityIdByName(@Query("cityName") String cityName);
复制代码


  紧接着我们便可以使用无所不能的RxJava来实现需求了。

  1.   ApiClient.weatherService.getCityIdByName("上海")

  2.   .flatMap(new Func1>() {

  3.   @Override

  4.   public Observable call(String cityId) {

  5.   return ApiClient.weatherService.getWeather(cityId);

  6.   }

  7.   }).subscribeOn(Schedulers.io())

  8.   .observeOn(AndroidSchedulers.mainThread())

  9.   .subscribe(new Action1() {

  10.   @Override

  11.   public void call(Weather weather) {

  12.   weatherView.displayWeatherInformation(weather);

  13.   }

  14.   });
复制代码


  哇哦!~ so easy!!!妈妈再也不用担心....

  源码地址:https://github.com/BaronZ88/MinimalistWeather

  MinimalistWeather这个项目还在开发中,这个项目不只包含了RxJava和Retrofit的使用,同时还包含MVP、Dagger2、OkHttp、ORMLite、RetroLambda、ButterKnife等等开源库的使用

  RxJava1.X的系列文章就到此结束了,由于本人对RxJava的理解有限,这一系列文章中如有错误还请大家指正。在使用RxJava过程中有任何疑问也欢迎大家和我交流。共同学习!共同进步!

  好啦,我们RxJava2见!~
原文作者:佚名  来源:开发者头条
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部