背景
当前Android新的框架越来越多,RxJava+Retrofit进行网络请求的框架尤为突出。故本次整合了RxJava+Retrofit进行网络请求最基本的用法。
框架简介
RxJava: 基于观察者模式的,链式调用方式的异步编程框架。
观察者模式,包含观察者(Observer)、被观察者(Observable)。两者之间绑定(subscribe)后即可由观察者去观察被观察者的行为。观察者在察觉到被观察者处理完某些事情后,会进行相应的操作。其优点是会使异步的代码逻辑阅读起来会非常清晰简洁。
RxJava详情请参考大神的文章:RxJava详解
Retrofit: 一个网络请求框架,底层使用了OKHttp框架。其最大的优点对OKHttp框架进行了进一步封装,网络请求逻辑只需要使用正确的注解即可完成,无需写大量代码,结构也更加清晰明了。
Retrofit详情参考另一位大神的文章:Retrofit详解
对于网络请求来说,网络请求模块属于被观察者,其请求网络后,得到的结果由观察者感知到并进行处理。
框架实战
下面,我们来使用MVP+RxJava+Retrofit来做一个查询版本号的Demo。
需要用到的接口:http://ezcloud.uniview.com/android/updatev3.json (可自行打开查看)
上述链接返回一个json字符串。我们需要写一个Demo解析其中一个字段的值(verCode)并打印出来。
首先,我们需要接入RxJava与Retrofit框架。接入方式见上述框架的详解。
其次,我们编写Retrofit网络请求接口(M层):
public interface HttpUtil {
@GET("/android/updatev3.json")
Observable<JsonObject> queryUpdate();
}
上述代码块,即为Retrofit的网络请求接口,我们只需要写一个接口,加上相应的注解即可,不需要实现它。
其中@GET表示请求为get方式。请求的链接为后面括号中的值(请求链接在初始化Retrofit的时候传入)。
而返回值是一个被观察者: Observable。网络请求的结果是要被观察者观察并处理的。被观察者是一个Json对象。
接下来,我们初始化Retrofit并实现请求网络的逻辑(M层):
public class TestModel {
public Observable<JsonObject> loadVersionInfo() {
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl("http://ezcloud.uniview.com")
.build();
HttpUtil httpUtil = retrofit.create(HttpUtil.class);
return httpUtil.queryUpdate();
}
}
此处,我们创建了一个Retrofit对象,并且为其设置了Gson解码器(通过addConverterFactory)、RxJava适配器(通过addCallAdapterFactory)、请求主地址(通过baseUrl)。最后通过 retrofit.create(HttpUtil.class); httpUtil.queryUpdate();来请求网络并返回结果。
M层我们基本上写好了,接下来我们实现接收到网络数据后的逻辑(P层):
public class TestPresenter {
private String TAG = "TEST";
private TestModel testModel;
private TestView testView;
public TestPresenter(TestView testView) {
this.testView = testView;
testModel = new TestModel();
}
public void getVerCode() {
testModel.loadVersionInfo().subscribe(observer);
}
//创建一个观察者
private Observer<JsonObject> observer = new Observer<JsonObject>() {
@Override
public void onCompleted() {
Log.e(TAG, "Completed");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "Error");
e.printStackTrace();
}
@Override
public void onNext(JsonObject object) {
JsonObject jsonObject = object.get("data").getAsJsonObject();
testView.toastMessage("verCode is: " + jsonObject.get("verCode"));
}
};
}
这里主要使用了RxJava,我们一共做了两件事情:1、启动网络请求。2、处理网络数据。其中,启动网络请求时,我们将观察者与被观察者绑定到了一起,此时当Retrofit返回了网络数据后,会走到观察者中onNext回调中。(若网络请求异常,或onNext中发生崩溃,则会走到onError中,否则之后会走到onCompleted中)
最后,写出我们的界面(V层):
public class TestActivity extends Activity implements TestView {
private final String TAG = "TEST";
private TestPresenter presenter = new TestPresenter(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(){
@Override
public void run() {
super.run();
presenter.getVerCode();
}
}.start();
}
@Override
public void toastMessage(String str) {
Log.e(TAG,str);
}
}
public interface TestView {
void toastMessage(String str);
}
该界面极度清爽,这就是MVP的好处。
总结
RxJava+Retrofit,封装网络请求接口非常容易,并且能满足各种需求,也可以搭配各种其它框架,这也是它流行的原因之一。
此文章仅示例基本用法,深入的用法还需要大家自行钻研