分享 Retrofit+RxJava+MPAndroidChart 未来一周天气气温预测案例

本文主要是介绍分享 Retrofit+RxJava+MPAndroidChart 未来一周天气气温预测案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

上周我写了一篇MPAndroidChart的使用技巧 ,得到了不少人的响应。至少自己写的文章还是有人去看,很是激励。毕竟我在学习Android开发的时候也是一直看着同行前辈们在技术社区上的干货输出,慢慢地进步起来。当在一些技术点上有了自己的一般见解,也应当回馈社区。

感概完了,现在还是言归正传吧。当掌握了一个技术点之后,怎样在项目中运用到这个技术点,还需要自己好好琢磨琢磨一下的。上次在MPAndroidChart的使用技巧案例中,数据都是自己写死的。现在就来看看MPAndroidChart怎样结合后台的传过来的数据展示图表吧。

在这次的案例中,我使用的是近段时间以来很潮很火的Retrofit+RxJava(这两种开发技术堪称一对CP啊!)来对后台进行网络请求。如果对Retrofit使用还不是很熟悉的话,可以看看之前我的写过一篇 Retrofit网络请求框架基础操作。而对于RxJava,我并未进行深入的研究,但可以看看一些大神写的博客,例如这位大头鬼Bruce。(PS:在案例中我对Retrofit请求时做了一些封装,在点击button前,未显示图表,点击button之后,才显示图表)

Talk is cheap,show you the code

  • 导入MPAndroidChart的jar包(这一步可以参考MPAndroidChart的使用技巧)

  • 添加依赖

    compile fileTree(dir: 'libs', include: ['*.jar'])testCompile 'junit:junit:4.12'compile 'com.android.support:appcompat-v7:23.3.0'compile 'com.squareup.okhttp3:okhttp:3.2.0'compile 'com.squareup.retrofit2:retrofit:2.0.1'compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'compile 'io.reactivex:rxandroid:1.1.0'compile 'io.reactivex:rxjava:1.1.0'compile 'com.orhanobut:logger:1.11'compile project(':JNChartLib')
  • 创建请求接口(使用的接口地址:http://apis.baidu.com/heweather/weather/free )
public interface NetRequest {@GET("/heweather/weather/free?/")Observable<WeatherInfo> getWeatherByRxJava(@Header("apiKey")String apiKey, @Query("city")String city);}
  • 创建网络接口服务的封装类(通过单例模式来获取网络请求接口的对象)
public class RetrofitWrapper {private static RetrofitWrapper instance;private Context mContext;private Retrofit retrofit;private RetrofitWrapper() {Gson gson = new Gson();//创建Retrofit对象retrofit = new Retrofit.Builder().baseUrl(Constant.BASE_URL)//配置转化库,默认是GSON.addConverterFactory(GsonConverterFactory.create(gson))//配置回调库,采用RxJava.addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();}public static RetrofitWrapper getInstance() {if (instance == null) {synchronized (RetrofitWrapper.class){if (instance==null){instance = new RetrofitWrapper();}}}return instance;}/*** 创建请求接口的对象* @param service* @param <T>* @return*/public <T> T create(final Class<T> service) {return retrofit.create(service);}}
public class WeatherInfoModel {private static  WeatherInfoModel weatherInfoModel;private NetRequest netRequest;public WeatherInfoModel(Context context) {netRequest = (NetRequest) RetrofitWrapper.getInstance().create(NetRequest.class);}public static WeatherInfoModel getInstance(Context context) {if (weatherInfoModel == null) {weatherInfoModel = new WeatherInfoModel(context);}return weatherInfoModel;}/*** 查询天气** @param weatherInfoReq* @return*/public Observable<WeatherInfo> queryWeatherByRxJava(WeatherInfoReq weatherInfoReq) {Observable<WeatherInfo> infoCall = netRequest.getWeatherByRxJava(weatherInfoReq.apiKey, weatherInfoReq.city);return infoCall;}
}
public class MainActivity extends Activity {private Button request;private LineChart chart;private WeatherInfoModel weatherInfoModel;private int i = 0;private ProgressDialog pd;private ArrayList<String> xValues = new ArrayList<>();private ArrayList<Entry> yValues2Max = new ArrayList<Entry>();private ArrayList<Entry> yValues2Min = new ArrayList<Entry>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);weatherInfoModel = WeatherInfoModel.getInstance(getApplicationContext());initViews();initParams();initEvent();}/**初始化请求参数*/private WeatherInfoReq initParams() {WeatherInfoReq weatherInfoReq = new WeatherInfoReq();weatherInfoReq.apiKey = Constant.API_KEY;weatherInfoReq.city = Constant.CITY;return weatherInfoReq;}/**初始化控件*/private void initViews() {request = (Button) this.findViewById(R.id.request);chart = (LineChart) this.findViewById(R.id.weatherChart);}private void initEvent() {final Gson gson = new Gson();request.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//创建访问的API请求weatherInfoModel.queryWeatherByRxJava(initParams()).subscribeOn(Schedulers.io())// 指定观察者在io线程(第一次指定观察者线程有效).doOnSubscribe(new Action0() {//在启动订阅前(发送事件前)执行的方法@Overridepublic void call() {pd = new ProgressDialog(MainActivity.this);pd.setMessage("请稍后...");pd.show();}}).flatMap(new Func1<WeatherInfo, Observable<WeatherResult>>() {@Overridepublic Observable<WeatherResult> call(WeatherInfo weatherInfo) {return Observable.from(weatherInfo.getHeWeatherDataList());}}).flatMap(new Func1<WeatherResult, Observable<DailyForecast>>() {@Overridepublic Observable<DailyForecast> call(WeatherResult weatherResult) {return Observable.from(weatherResult.getDaily_forecast());}}).observeOn(AndroidSchedulers.mainThread())//指定订阅者在主线程.subscribe(new Subscriber<DailyForecast>() {@Overridepublic void onCompleted() {pd.dismiss();chart.setDescription("广州气温预测");LineChartManager.setLineName("最高温度");LineChartManager.setLineName1("最低温度");LineChartManager.initDoubleLineChart(MainActivity.this, chart, xValues, yValues2Max, yValues2Min);}@Overridepublic void onError(Throwable e) {pd.dismiss();}@Overridepublic void onNext(DailyForecast dailyForecast) {int j = i++;xValues.add(dailyForecast.getDate());yValues2Max.add(new Entry(Float.valueOf(dailyForecast.getTmp().getMaxTem()), j));yValues2Min.add(new Entry(Float.valueOf(dailyForecast.getTmp().getMinTem()), j));}});}});}}

总结

这次的案例代码还是比较简单的,相信大家看起来应该容易明白。如果要说难点,应该就是RxJava的使用上,因为RxJava是响应式编程,这与我们之前编程的思想有点不同,但它的好处就是代码简洁,优雅,随意地变换线程,而且重要的是它的操作符真的非常牛逼,如果你深入去研究的话,都会对着电脑竖起你的大拇指。而这次的图表中,如果大家看了效果图之后,会发现这次y轴上和图表中的数据都带有单位符号,这是我重写了ValueFormatter和YAxisValueFormatter这两个类,具体的写法大家可以看看源码。本文没有贴出一些bean类和常量类,如需请看源码!最后,小弟不才,还望多多指教!

Retrofit-RxJava-MPAndroidChart-

效果图


点击前


点击后

AndroidRxJavaRetrofit

这篇关于分享 Retrofit+RxJava+MPAndroidChart 未来一周天气气温预测案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1027032

相关文章

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

一文彻底搞懂Java 中的 SPI 是什么

《一文彻底搞懂Java中的SPI是什么》:本文主要介绍Java中的SPI是什么,本篇文章将通过经典题目、实战解析和面试官视角,帮助你从容应对“SPI”相关问题,赢得技术面试的加分项,需要的朋... 目录一、面试主题概述二、高频面试题汇总三、重点题目详解✅ 面试题1:Java 的 SPI 是什么?如何实现一个

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

SpringCloud中的@FeignClient注解使用详解

《SpringCloud中的@FeignClient注解使用详解》在SpringCloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解来标记Feign客户端接口,这篇文章... 在Spring Cloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

Java如何从Redis中批量读取数据

《Java如何从Redis中批量读取数据》:本文主要介绍Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一.背景概述二.分析与实现三.发现问题与屡次改进3.1.QPS过高而且波动很大3.2.程序中断,抛异常3.3.内存消

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获