前言.
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各种操作符详解请查看:点击打开链接