一款查询中国天气的软件
数据来源:http://apis.baidu.com/apistore/weatherservice
实战中学习Retrofit、RxJava、RxAndroid的实际应用,若未接触过可先移步Retrofit、RxJava&RxAndroid进行学习。
先看效果图:

开启我们的项目,首先启动Android Studio建立一个工程,在build.gradle添加如下信息:
|
|
ps:Picasso原本是用不上的,不过还是手贱添加了依赖,后面比较牵强地用上了,实际在此项目中并无明显作用
然后我们来定义一个接口NetService
|
|
ps:代码中的Observable类是属于RxJava中的,返回的结果集是实体类,具体声明依实际项目需要,此处解析的实体类可参考文末源码中的定义。
接着配置一下Application
|
|
ps:记得在AndroidManifest.xml文件中配置Application标签,增加android:name属性
开始首页的界面布局就一个ViewPager,每添加一个城市,就往ViewPager里添加一个Fragment。此处使用的PagerAdapter是FragmentStatePagerAdapter,为什么不用FragmentPagerAdapter呢?因为要动态管理城市的天气信息,若使用FragmentPagerAdapter,在删除城市时,页面依然保留在内存中,并没有完全从ViewPager中移除,会造成不好的用户体验,但使用FragmentStatePagerAdapter会造成性能上的损失,在更新城市列表时会有一定的延时,目前还没有好的解决方式,有兴趣的读者可去搜索一下两者的区别。具体代码如下:
ViewPager的Adapter如下:
MainActivity代码如下:
此处用到序列化操作,把每次获取的数据在退出应用时进行保存,由于城市的ID是唯一的,故保存的文件名为城市名,序列化的具体代码可参考源码。此处启动Activity的方式采用startActivityForResult的方式,具体启动在Fragment里实现,应注意使用的是getActivity().startActivityForResult(requestCode,intent),这样返回的结果将会在Fragment依附的Activity即MainActivity里进行处理。
说了怎么多,重点来了,就是我们的WeatherFragment,对于Fragment,编译器是不推荐我们直接new一个Fragment,而是让我们自己实现newInstance的方法,并在方法里实现setArguments()方法,具体如下:
然后在onCreate()里获取参数
省略View的初始化过程,具体查看源码,看重点的方法fetchData()
逻辑比较简单,先是从文件中获取数据展示到界面上,setData()方法是将数据与View绑定,接着判断是否连接网络,若无网络弹出提示并结束,否则从网络获取数据。subscribeOn()和observeOn()分别用于切换线程。