一款查询中国天气的软件
数据来源: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()
分别用于切换线程。