最近比较流行RxJava 这个技术,网上也很多相关的学习资料,这里我先列举一些大神给的讲解:
1. 抛物线大神的:给android开发者的RxJava详解
基本上,只要你精读了,那么你对RxJava就有不少的了解了。也明白这个框架在现在的是有多流行。在经验不算多的我看来,开发app。
使用一个MVP的框架,通过RxJava来进行响应消息的传递,是一个相对比较完整而且整齐的框架了。而使用Okhttp,也为你的网络请求省了不少时间。
还是说回最近研究的一个主题吧,就是使用RxJava,和OKhttp结合的一个http的请求。这些在MVP框架中都属于M这个层级只中的,在没有使用这些框架的时候,会发现自己做的http请求不如人意,消息的传递在callback hell中纠结。okhttp是国外大神写的一个速度快,而且完善的http请求。RxJava就是为解决callback hell的神器。为什么这里还多了个fastjson 呢。这个fastjson是我们对网络数据传递,还有网络数据回来进行解析的,以便真正的给app端调用。
首先简单讲讲目录结构:没有专门分文件夹,全部放在一个包里面。
1.OktestActivity 就是V, 通过一个接口IOKView ,给P端进行调用.
2.OKPresenter, P端,这个通过接口进行UI的更新,而对于M回来的数据,会进行进一步的处理,而和M之间的交互,就是通过RxJava来进行的。
3.OKModel,这个是服务端,也是数据请求的一端,例如常见的有读写数据库、网络请求等,这端主要记录一些网络请求的,而当中是使用了OKHttp进行了数据的请求。
4.BigDataBean,这个是网络请求回来的json数据,通过这个fastJson, 解析成为这个类型的的数据。
V端代码:OktestActivity.java
代码很简单,其实主要使用了ButterKnife 进行注入操作,然后就是调用P层的方法。提供接口给P层进行更新UI.
package com.xuan.moveforever.app_move.HTTP_RX_test.okHttpTest;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.xuan.moveforever.R;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class OktestActivity extends AppCompatActivity implements IOKView{
@Bind(R.id.ok_get)
Button ok_get;
@Bind(R.id.ok_post)
Button ok_post;
@Bind(R.id.ok_reset)
Button ok_reset;
@Bind(R.id.text_response)
TextView text_response;
@OnClick({R.id.ok_get,R.id.ok_post,R.id.ok_reset})
void onClickListener (View view) {
switch (view.getId()) {
case R.id.ok_get:
okGet();
break;
case R.id.ok_post:
okPost();
break;
case R.id.ok_reset:
okReset();
break;
}
}
private OKPresenter presenter;
private void okGet(){
presenter.okGet();
}
private void okPost(){
presenter.okPost();
}
private void okReset(){
presenter.okReset();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_oktest);
ButterKnife.bind(this);
presenter= new OKPresenter(this);
}
@Override
public void setTextResponse(String s) {
text_response.setText(s);
}
}
P端代码:
P层主要的操作就是调用M层的网络请求,然后数据是通过RxJava回来的,调用M层,返回的是一个 Observable<Object> ,一个RxJava的被观察者的对象。subscribeOn主要是设定了被观察者所处的线程,observeOn,设定的是观察者所处的线程。最后观察者会得到M层回来的数据,进行进一步的处理(P层的主要作用,处理M层回来的数据),最后就是通过接口对View,UI进行刷新的工作。
package com.xuan.moveforever.app_move.HTTP_RX_test.okHttpTest;
import android.util.Log;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by xuanweijian on 2016/2/18.
*/
public class OKPresenter {
IOKView mView;
private OKModel model;
public OKPresenter(IOKView view){
this.mView = view;
model = new OKModel();
}
public void okGet(){
model.okGet().subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
public void okGet2(){
model.okGet2().subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber2);
}
public void okPost(){
model.okPost().subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber3);
}
public void okReset(){
okGet2();
}
//利用Rx 放回的处理数据
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
Log.i("RX", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.i("RX","error");
}
@Override
public void onNext(String s) {
Log.i("RX","next");
Log.i("RX","display--"+Thread.currentThread().getName());
mView.setTextResponse(s);
}
};
Subscriber<Object> subscriber2 = new Subscriber<Object>() {
@Override
public void onCompleted() {
Log.i("RX", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.i("RX","error"+"--"+ e);
}
@Override
public void onNext(Object o) {
BigDataBean bean = (BigDataBean)o;
mView.setTextResponse(bean.TodayVolume+"---"+bean.TotalIncome+"---"+bean.TotalTradingVol+"---"+bean.YesterdayVolume);
}
};
Subscriber<Object> subscriber3 = new Subscriber<Object>() {
@Override
public void onCompleted() {
Log.i("RX", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.i("RX","error"+"--"+ e);
}
@Override
public void onNext(Object o) {
BigDataBean bean = (BigDataBean)o;
mView.setTextResponse(bean.TodayVolume+"---"+bean.TotalIncome+"---"+bean.TotalTradingVol+"---"+bean.YesterdayVolume);
}
};
}
M层代码:
这层只是对Okhttp 进行调用,还有对其进行进一步的封装,代码太多,就不贴出来了,其实主要就是调用网络,然后创建一个RxJava的被观察者的类,然后异步进行网络请求,最后得到的Json数据,利用FastJson,进行解析,在P层就直接得到了 JavaBean的类型,直接明了。
package com.xuan.moveforever.app_move.HTTP_RX_test.okHttpTest;
import com.xuan.okhttp.OkHttpUtils;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import rx.Observable;
import rx.Subscriber;
import rx.schedulers.Schedulers;
/**
* Created by xuanweijian on 2016/2/18.
*/
public class OKModel {
public OKModel(){
}
/**
* 原始的OK操作
* @return
*/
public Observable<String> okGet(){
return Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
try {
OkHttpClient mClinet = new OkHttpClient();
final Request request = new Request.Builder()
.url("XXXXXXXXXXX")
.build();
Call call = mClinet.newCall(request);
Response response = call.execute();
String s=response.body().string();
subscriber.onNext(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}).observeOn(Schedulers.io());
}
//Rx 结合 OKhttp 的封装。
public Observable<Object> okGet2(){
return OkHttpUtils
.get()
.url("xxxxxxxxxxxx")
.build()
.execute2(BigDataBean.class);
}
public Observable<Object> okPost(){
return OkHttpUtils.postString()
.url("xxxxxxxxxxxxxxxx")
.content("" + System.currentTimeMillis())
.build()
.execute2(BigDataBean.class);
}
public Observable<String> okReset(){
return null;
}
}