项目Demo已经上传至github
本人android小白一枚,在学习android的过程中,我感受很深,在做了这么多练手的项目之后,我觉得android就像一块画板,画板是白纸,作为android的开发人员,要做的就是运用一切可能,去在画板上画出让人看的懂并且美观的画。说起来,我们却也属于艺术家这一行了。。。
在我看来,android是为了展示数据的,这里就要分两个步骤了,第一就是怎样去展示,这部分是相当于UI的工作,,第二就是数据的来源,数据从哪来,怎么来,来的是什么,有什么规律,这些都需要我们去考虑,一般来说,就现在的开发模式来说,数据都是存储在数据库中,后台的工作人员通过各种语言去实现对数据库的增删改查,然后将数据库中的数据进行加工处理,部署在服务器上,android端就需要通过访问服务器去获取并解析数据,这里就涉及到获取并解析数据了。不涉及到网络的应用现如今基本上是不复存在的了,一款App,没有强大的后台作为其支撑,纵然你将界面做的再花哨华丽,终究只能算是“花瓶”,“鸡肋”。
所以在开始开发一个项目之前,选取一款优秀的网络框架是非常有必要的。RxJava和Retrofit出现也很久了,之前是一直使用okHttp去封装一个请求类,这样虽然能够正确的请求到数据,但是,代码不仅复杂繁多,遇到多请求问题就会让逻辑不清晰,思维很容易进入混乱,说再多都无法表达多请求问题的恐怖,亲身经历才能够感受它的复杂。
RxJava的概念其实很模糊,我对它的理解就是一个给你方便处理异步问题的框架,到底有多方便,体会过才知道。。。
Retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,Retrofit 除了提供了传统的 Callback 形式的 API,还有 RxJava 版本的 Observable 形式 API,在我看来,retrofit有点像javaee里的springboot框架,通过xml文件配置好一切后,直接就可以在方法头前添加注释来执行网络请求,实在是不能再方便了。
使用方法:build.gradle文件中引入几个jar
compile 'io.reactivex.rxjava2:rxjava:2.0.7' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.squareup.okhttp3:okhttp:3.5.0' compile 'com.squareup.okhttp3:logging-interceptor:3.6.0' compile 'com.jakewharton:butterknife:7.0.1' compile 'com.trello.rxlifecycle2:rxlifecycle:2.1.0' compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
说再多,不如一个例子来的简单,我们现在定义好一个场景,来练练手。
假设现在有这么一组json数据
results是一个json数据。它的请求url是http://gank.io/api/data/福利/10/1。因为本篇重点就是在讲运用网络框架去取数据,所以在这里,只要取到数据就可以了,至于怎样去展示,不是本篇重点,所以不做讨论。
1.首先观察json数据的规律,要自定义一个实体,负责将json数据解析成一个个实体类,方便去调用。
总体类:
public class BaseResult<T> { private int code; private String message; private T results; private boolean error; public T getResults() { return results; } public void setResults(T results) { this.results = results; } public boolean isError() { return error; } public void setError(boolean error) { this.error = error; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }results中的数据类:Meizi
public class MeiZi { /** * _id : 59cd9b53421aa9727fdb25eb * createdAt : 2017-09-29T09:01:07.894Z * desc : 9-29 * publishedAt : 2017-09-29T11:21:16.116Z * source : chrome * type : 福利 * url : https://ws1.sinaimg.cn/large/610dc034ly1fk05lf9f4cj20u011h423.jpg * used : true * who : daimajia */ private String _id; private String createdAt; private String desc; private String publishedAt; private String source; private String type; private String url; private boolean used; private String who; public String get_id() { return _id; } public void set_id(String _id) { this.