【版权说明】
1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564
2. 项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!
-------------------------------------------
基于MVVM框架的高德天气APP:
网络应用框架和组件实现:
- RxJava Android使用教程:RxAndroid是在RxJava(响应式编程)基础上添加了Android线程调度,处理异步网络请求等耗时任务。
一、 技术背景:
RxJava,一个实现异步操作的库,通过观察者模式来实现的异步耗时任务的UI订阅更新,适用于android 应用的网络请求(异步耗时)+UI刷新(Main Thread)订阅。
二、代码实现:
1. gradle中集成RxAndroid jar:
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
2. 使用RxJava 作为retrofit2的回调库(retrofit2配置参照:Android 高德天气移动应用开发之十):
private void initRetrofit() {
mRetrofit = new Retrofit.Builder()
.baseUrl(ApiContants.AMAP_BASE_URL)//设置服务器路径
.client(mOkHttpClient)//设置使用okhttp网络请求
.addConverterFactory(GsonConverterFactory.create())//添加转化库,默认是Gson
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//添加回调库,采用RxJava
.build();
}
3. 定义网络请求的methods,返回io.reactivex.Observable被观察者:
import io.reactivex.Observable;
public interface ApiService {
@FormUrlEncoded
@POST(ApiContants.AMAP_WEATHER_GET)
Observable<LiveWeatherResponseData> livesweatherPost(
@Field("city") String city,
@Field("key") String key,
@Field("extensions") String extensions,
@Field("output") String output
); }
4. Rxjava可处理不同任务场景(本次只以打包:当前天气+一周预报天气 requests 再通知UI刷新为例):
- map 操作符:输入:对原始的参数进行加工处理;输出:返回基本类型的请求数据;
- flatMap 操作符:输入:也是对原始的参数进行加工处理;输入:返回Observable的请求返回数据;
- zip 操作符:输入:打包多个网络请求;输出:统一返回请求返回的数据
/**
* 查询城市天气
*/
public void queryCityWeather(final CityBean cityinfo) {
/**task1: 查询当前天气*/
Observable<LiveWeatherResponseData> observable1 =
WeatherRequestClient.getInstance().liveWeatherPost(cityinfo.adcCode).subscribeOn(Schedulers.io());//被观察者Observable运行在子线程
/**task2: 查询未来天气预报*/
Observable<AllForecastResponseData> observable2 =
WeatherRequestClient.getInstance().forecastWeatherPost(cityinfo.adcCode).subscribeOn(Schedulers.io());
/**zip: 实现task1+ task2 异步任务都完成时,回调 订阅的UI刷新(Observer 观察者)*/
Observable.zip(observable1, observable2,
new BiFunction<LiveWeatherResponseData, AllForecastResponseData, ArrayList<BaseItemBean>>() {
@Override
public ArrayList<BaseItemBean> apply(LiveWeatherResponseData livedata,
AllForecastResponseData allForecastdata) throws Exception {
/**task1+task2 ,此处可以处理耗时流程(子线程)*/
List<DayForecastBean> dayForecastList = null;
ArrayList<BaseItemBean> dataList = new ArrayList<>();
dataList.clear();
if (livedata != null && livedata.isSuccessful()) {
dataList.add(livedata.getWeatherLiveResult());
}
if (allForecastdata != null
&& allForecastdata.isSuccessful()
&& allForecastdata.getWeatherAllResult() != null) {
dayForecastList = allForecastdata.getWeatherAllResult().dayForecastBeanList;
}
for (DayForecastBean fdata : dayForecastList) {
dataList.add(fdata);
}
return dataList;
}
}).observeOn(AndroidSchedulers.mainThread()) //观察者运行在UI线程
.subscribe(new Consumer<List<BaseItemBean>>() {
@Override
public void accept(List<BaseItemBean> dataList) throws Exception {
/**实现UI订阅逻辑,不可以处理耗时流程,避免出现ANR(AndroidSchedulers.mainThread)*/
mCityWeatherDatas.put(cityinfo, dataList);
CityWeatherRecyclerAdapter adapter = getCityWeatherRecyclerAdapter(cityinfo);
adapter.setAdapterData(dataList);
}
});
}
-------------------------------------------
文章目录(未完,待续):
一:android 应用子功能及移动框架总述 https://blog.csdn.net/cbk861110/article/details/86665564
二:android 高德天气API说明及城市天气查询实现 https://blog.csdn.net/cbk861110/article/details/86665655
三:android 自定义控件实现(ActionBar + PageIndicatorView) https://blog.csdn.net/cbk861110/article/details/86665790
四:android ViewPager实现左右页面滑动切换 https://blog.csdn.net/cbk861110/article/details/86665964
五:android应用权限动态申请 https://blog.csdn.net/cbk861110/article/details/86666321
六:android RecyclerView 封装及使用 https://blog.csdn.net/cbk861110/article/details/86666392
七:android Xutils3文件下载实现(高德天气城市配置) https://blog.csdn.net/cbk861110/article/details/86666573
八:android DiskLruCache 磁盘缓存 封装和使用 https://blog.csdn.net/cbk861110/article/details/86666664
九:android ThreadPoolExecutor线程池 封装及使用 https://blog.csdn.net/cbk861110/article/details/86667101
十:android 天气网络请求框架(retrofit2&okhttp3&Gson) 封装及使用 https://blog.csdn.net/cbk861110/article/details/86667375
十一:android RxAndroid(响应式编程) 异步网络请求实现 https://blog.csdn.net/cbk861110/article/details/86669178
十二:android DataBinding 数据和UI双向绑定实现 https://blog.csdn.net/cbk861110/article/details/86669708
十三:android room数据库 天气数据读写实现 https://blog.csdn.net/cbk861110/article/details/86670354
十四:android LiveData 使用方法(实现城市天气自动刷新) https://blog.csdn.net/cbk861110/article/details/86670531
十五:android ViewModel 使用方法 https://blog.csdn.net/cbk861110/article/details/86670703
十六:android 集成友盟消息推送机制(U-Push) https://blog.csdn.net/cbk861110/article/details/86683849
-------------------------------------------
【版权说明】
1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564
2. 项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!