前言.
Rxjava
由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受广大 Android
开发者的欢迎。我们在github上就可以看到rxjava对广大Android开发者的影。

详细了解Reactivex点击打开链接
本文主要基于Rxjava 2.0讲解


. 下面我们就说一下Rxjava是什么?以及 RxJava特点 ,原理 ,基本实例等几方面说一下RxJava
1.RxJava是什么?
RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.
It extends the observer pattern to support sequences of data/events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety and concurrent data structures.
总结 :一个通过使用可观察的序列来组合异步和基于事件流的程序操作的库
|
2.RxJava特点
.逻辑简洁 , 异步 , 内部支持多线程操做 ,使用简单, 随着程序逻辑的复杂,依然保持简洁 |
3.RxJava原理
Rxjava 原理 基于 一种扩展的观察者模式
Rxjava 的扩展观察者模式中有4个角色
-
角色 |
作用 |
被观察者(Observable) |
产生事件 |
观察者(Observer) |
接收事件,并给出响应动作 |
订阅(Subscribe) |
订阅观察者和被观察者 |
事件(Event) |
被观察者 & 观察者 沟通的载体 |
三者之间的关系 : 被观察者
Observable 通过 订阅(Subscribe) 按顺序发送事件 给观察者 (Observer) , 观察者(Observer) 按顺序接收事件 & 作出对应的响应动作
|
4.具体使用
1.在我们的工程 build.gradle 下配置 :
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.7'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
2.请求接口
/**
* Created by yang
*/
public interface ApiStores {
public static String COMMEN = "app.php?g=App&c=Home_app&a=";
/**
*班级管理列表
* @param data
* @return
*/
@POST(COMMEN + "App_is_login")
Observable<ClassManagementBean> userLogin(@Body RequestBody data);
@POST("app.php?g=App&c=Meal_app&a=" + "App_middle_footer")
Observable<ClassManagementBean> nearbyInstitution(@Body RequestBody data);
} |
3.网络请求及数据解析转换打印日志
public class Manager {
private static Manager instance;
public static Manager getInstance() {
if (null == instance) {
instance = new Manager();
}
return instance;
}
private Manager() {
}
/**
*班级管理列表
*/
public Subscriber<ClassManagementBean> userLogin(@NonNull Map<String, String> map, @NonNull Subscriber<ClassManagementBean> subscribe) {
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, String> entry : map.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
RequestBody requestBody = builder.build();
Observable<ClassManagementBean> observable = NetServiceUtils.getService(ApiStores.class).userLogin(requestBody);
new NetServiceUtils<ClassManagementBean>().invoke(observable, userLogin, subscribe);
return subscribe;
}
/**
*班级管理列表
*/
private Action1<ClassManagementBean> userLogin = ClassManagementBean -> {
Log.e("========== ", "" + JSON.toJSONString(ClassManagementBean));
};
}
|
4.网络请求
**
* @author yang
* @date 2016/3/23.
*/
public class NetServiceUtils<C> {
public static final String CONNECTION_URI = "http://demo2.artmofang.com/";
/**
* 获取Observable<T></>
*
* @param serviceCls service class</>
* @param <T> Service实体-
* @return
*/
public static <T> T getService(@NonNull final Class<T> serviceCls) {
return getRetrofit().create(serviceCls);
}
/**
* 请求URL带token
*
* @param serviceCls
* @param <T>
* @return
*/
public static <T> T getServiceToken(@NonNull final Class<T> serviceCls) {
return getTokenRetrofit().create(serviceCls);
}
public void invoke(@NonNull final Observable<C> observable, @NonNull final Action1<C> dataHandlers, @NonNull final Subscriber<C> subscribe) {
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
//数据二次加工处理
.doOnNext((Consumer<? super C>) dataHandlers)
//请求回调
.subscribe((Observer<? super C>) subscribe)
;
}
/**
* 配置Retrofit并获取Retrofit对象
*
* @return
*/
public static Retrofit getRetrofit() {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
// .addNetworkInterceptor(new StethoInterceptor())
.build();
return new Retrofit.Builder().client(okHttpClient).baseUrl(CONNECTION_URI)
//解析器
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
}
5.调用接口传参请求数据
HashMap<String, String> map = new HashMap<>();
map.put("phone", account);
map.put("password", pwd);
ArtMoFangManager.getInstance().userLogin(map, getSubscriber(Constants.USERLOGIN));
|
具体参考代码 :点击打开链接
RxJava各种操作符详解请查看:点击打开链接
|
|