关于RxJava在项目中的配置和使用
RxJava的好处,简单概括就是它使代码更加简洁,高效,灵活!
了解RxJava: https://github.com/lzyzsd/Awesome-RxJava
第一篇博客给对RxJava感兴趣的人一些入门的指引,以及为什么要使用RxJava。
RxJavaDemo:https://github.com/cn-ljb/rxjava_for_android
这个Demo中示例了RxJava在Android中的应用。
RxJava,RxAndroid,Retrofit,再配合Java8的Lambda表达式,让你的代码看起来像在飞一样。
Retrolambda是一个Java类库,在Java5、6、7 上实现Java8的Lambda表达式的功能。你可以通过Retrolambda让使用Lambda表达式的Java8代码运行在Java7或更低版本上。不过需要Java 8来编译源码。
Android Studio中的配置:
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
}
}
apply plugin: 'me.tatarka.retrolambda'
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
//当前依赖库
dependencies {
compile 'io.reactivex:rxjava:1.1.5'
compile 'io.reactivex:rxandroid:1.2.0'
compile 'com.f2prateek.rx.preferences:rx-preferences:1.0.1'
compile 'com.google.code.gson:gson:2.5'
compile 'com.trello:rxlifecycle:0.6.1'
compile 'com.trello:rxlifecycle-components:0.6.1'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
}
介绍使用RxJava需要的一些相关库,在上面的连接中更加详细:
- https://github.com/ReactiveX/RxJava
- https://github.com/ReactiveX/RxAndroid
- https://github.com/JakeWharton/RxBinding
- https://github.com/f2prateek/rx-preferences
- https://github.com/trello/RxLifecycle
- https://github.com/square/retrofit
- https://github.com/pushtorefresh/storio
- https://github.com/square/sqlbrite
- https://github.com/tbruyelle/RxPermissions
关于使用RxJava的一些小例子:
// 创建observable
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello RxJava");
subscriber.onCompleted();
}
});
// 创建subscriber
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
log(s);
}
};
// 订阅
observable.subscribe(subscriber);
//上面是基本的用法,我们直接把创建和订阅连接起来,完整的代码如下
Observable.just("Hello RxJava").subscribe(new Action1<String>() {
@Override
public void call(String s) {
log(s);
}
});
//使用Lambda表达式后:
Observable.just("Hello RxJava").subscribe(s -> log(s));
/**
* Android View 事件处理
*/
ViewObservable.clicks(findViewById(R.id.text), false).subscribe(new Action1<OnClickEvent>() {
@Override
public void call(OnClickEvent onClickEvent) {
doSomething();
}
});
使用Lambda表达式后:
ViewObservable.clicks(findViewById(R.id.text), false).subscribe(s -> doSomething());
网络请求方面使用Retrofit2:http://square.github.io/retrofit/
先定义请求接口:
public interface Rservice {
@GET("query?key=12f173de6a551")
Call<WechatBean> getMethod();
@GET("query?key=12f173de6a551")
Observable<WechatBean> getMethodOb();
@POST("user/name")
<T> Observable<WechatBean> postMethodOb(@Body T t);
//下面这种方法是错误的,不支持
@GET("{url}")
Call<WechatBean> getMethod(@Path("url") String url);
}
public class Retrofit2Utils {
public static final String BASEURL = "http://apicloud.mob.com/wx/article/category/";
public static void getMethod(Subscriber subscriber){
Rservice rservice = getRetrofit().create(Rservice.class);
rservice.getMethodOb().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.unsubscribeOn(Schedulers.io()).subscribe(subscriber);
}
public static <T> void postMethod(T t,Subscriber subscriber){
Rservice rservice = getRetrofit().create(Rservice.class);
rservice.postMethodOb(t).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.unsubscribeOn(Schedulers.io()).subscribe(subscriber);
}
private static Retrofit getRetrofit(){
return new Retrofit.Builder().baseUrl(BASEURL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
// .client(genericClient()) //添加统一header
.build();
}
public static OkHttpClient genericClient() {
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request() .newBuilder()
.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
.addHeader("Accept-Encoding", "gzip, deflate")
.addHeader("Connection", "keep-alive")
.addHeader("Accept", "*/*")
.addHeader("Cookie", "add cookies here")
.build();
return chain.proceed(request);
}
}).build();
return httpClient;
}
}
//使用示例:GET请求
Retrofit2Utils.getMethod(new Subscriber<WechatBean>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(WechatBean wechatBean) {
tv_reuslt.setText("Post Result:\r\n" + wechatBean.getMsg());
}
});
//POST请求使用@Body传一个对象
我想抽取一个公共方法,不在注解里写url,而是传url,@Path注解只支持单个的字段,不支持如"user/name"带"/"的字段,所以只能每个请求都要写一个方法了。
另附上一个不错的Demo:https://github.com/oxoooo/mr-mantou-android
网友评论