1、申请ID:lijsz124
2、个人邮箱:83386041@qq.com
3、原创技术文章:安卓开发类的
RxAndroid以及配合Retrofit使用
现在搞Android不看点装B的东西都不好意思说自己是搞Android的。之前一直听说 RxAndroid 这个东西,看起来有些B格,下面就简单说说这个东西吧。
RxAndroid 其实是基于 RxJava 的扩展版让这个框架更好的用在手机端的场景上面,看一个新的东西怎么才能学得快?就是首先要知道这个玩意干嘛用的,上面场景下用。
RxAndroid 里面有2个对象,一个叫 Observable 这个东西就是个观测者 给 别人发数据的,还有个 对象叫 Subscriber 是订阅者,通俗来说就是 干活的。
先添加gradle: compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'最最最基本的例子:
Subscriber<String> mySubscriber = new Subscriber<String>() {
@Override
public void onNext(String s) { System.out.println(s); }
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
};
上面就是创建了一个最最最原始的一个 订阅者对象,然后下面在创建个 观察者。
Observable<String> myObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> sub) {
sub.onNext("Hello, world!");
sub.onCompleted();
}
}
);
看到实现接口的方法里面是不是感觉这个2个对象有着某种联系?
当里 调用 myObservable.subscribe(mySubscriber); 的时候 就将 这2个对象关联起来了,马上就会执行 myObservable 的call 方法。mySubscriber的前2个方法就会被调用,onError的方法是在执行前2个方法出现异常的情况下才会执行。
看上面的代码也是比较多,感觉也没什么好用的啊?下面继续一种简便的写法。 Observable.just("我是发送的值").subscribe(new Action1<String>() {
@Override
public void call(String s) {
// s 就是 上面发送的值
}
});
这样的写法和上面的写法结果是一样的,call 变成的 just , Subscriber 的 3个方法就变成了 Action1了。 Observable.just("我是发送的值").subscribe(new Action1<String>() {
@Override
public void call(String s) {
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
}
}, new Action0() {
@Override
public void call() {
}
});Just 可以发送任何类型的值,并且可以多个值。 Observable.just("我是值",”我是值2”,”我是值3”).subscribe(new Action1<String>() {…… Call 方法会执行3次 除了这个 还可以支持更多操作,比如 map() ,filter() Observable.just(list).map(new Func1<List<String>, String>() { @Override
public String call(List<String> strings) {
//可以操作list再给
return null;
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i("aaaaaaaa", "rrrrrrrrr" + s);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
}
}, new Action0() {
@Override
public void call() {
}
});
Observable.just("aaaaa","vvvvvv").filter(new Func1<String, Boolean>() {
@Override
public Boolean call(String strings) {
// 做一些过滤操作,返回 true 则继续进 Action1
return null;
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i("aaaaaaaa", "rrrrrrrrr" + s);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
}
}, new Action0() {
@Override
public void call() { ...................... 假如写个启动页,3秒后调到首页 Observable.timer(3, TimeUnit.SECONDS, AndroidSchedulers.mainThread()).subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
}
});除了这些 操作符外还有很多,和 jquery比较相似,这样解决了 之前一堆回调的问题,链式api逻辑更清楚。可以设定Observable 和 Subscribe的 执行线程.subscribeOn(AndroidSchedulers.mainThread()).observeOn(Schedulers.newThread())可以用来代替 Handler。
现在就说说 配合 Retrofit 使用
gradle 添加依赖 compile 'com.squareup.retrofit2:retrofit:2.0.0'compile 'com.squareup.retrofit2:converter-gson:2.0.0'compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'这3个依赖 版本要一致。
retrofit 的使用就不在介绍了,直接看如何配合用。创建接口
public interface ApiService { @GET("api/search/{key}/{page}") Observable<Model> search(@Path("key") String key, @Path("page") int page);}注意重点,接口返回类型 是 Observable 不是 Call 了 Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://api.lmcw.cn/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build();
之前的创建 retrofit 添加 addCallAdapterFactory
ApiService apiService = retrofit.create(ApiService.class);
apiService.search("关键词", 1)
.subscribeOn(Schedulers.newThread()) //将网络请求也就是观察者在 新的线程
.observeOn(AndroidSchedulers.mainThread()) //Action1 在 主线程
.doOnSubscribe(new Action0() {
@Override
public void call() {
//可以显示等待框
}
}).subscribe(new Action1<Model>() {
@Override
public void call(Model model) {
//请求成功,返回实体类
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
//发生异常
}
}, new Action0() {
@Override
public void call() {
//关闭等待框
}
});
subscribeOn是影响生产者(Observable)生产数据的线程的,observeOn 影响则是 订阅者的线程的,和名字恰恰相反。
|