高德天气应用开发之十一:android RxAndroid(响应式编程) 异步网络请求 使用方法

版权声明:本文为博主原创文章,未经允许不得转载,如有问题,欢迎指正,谢谢! https://blog.csdn.net/cbk861110/article/details/86669178

【版权说明】

1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564

2. 项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!

-------------------------------------------

基于MVVM框架的高德天气APP:


网络应用框架和组件实现:

一、 技术背景:

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,框架和技术实现不妥之处,请帮忙指正),谢谢!

猜你喜欢

转载自blog.csdn.net/cbk861110/article/details/86669178