1.应用场景 延时执行操作 默认是子线程 可以通过observeOn 切换的是观察者的执行线程
Observable.just(1).delay(2000,TimeUnit.MILLISECONDS)
// .observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Log.e("lpf","延时执行--"+Thread.currentThread().getName());
}
});
默认观察者在子线程执行,使用observeOn控制线程操作。
2.执行网络耗时操作,并对数据进行变换操作
Observable.just(PATH).map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(@NotNull String s) throws Exception {
URL url = new URL(s);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(5000);
int responseCode = httpURLConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream inputStream = httpURLConnection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}
return null;
}
}).map(new Function<Bitmap, Bitmap>() {
@Override
public Bitmap apply(@NotNull Bitmap bitmap) throws Exception {
Log.d("lpf", "apply: 是这个时候下载了图片啊:" + System.currentTimeMillis());
return bitmap;
}
}).map(new Function<Bitmap, Bitmap>() {
@Override
public Bitmap apply(@NotNull Bitmap bitmap) throws Exception {
//添加水印
Paint paint = new Paint();
paint.setTextSize(56);
paint.setColor(Color.GREEN);
return drawTextToBitmap(bitmap, "水印来了,哈哈", paint, 100, 100);
}
}).compose(rxud()).subscribe(new Observer<Bitmap>() {
@Override
public void onSubscribe(@NotNull Disposable d) {
progressDialog = new ProgressDialog(RxjavaActivity.this);
progressDialog.setTitle("download run");
progressDialog.show();
}
@Override
public void onNext(@NotNull Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
@Override
public void onError(@NotNull Throwable e) {
Log.d("lpf", e.getMessage());
progressDialog.dismiss();
}
@Override
public void onComplete() {
progressDialog.dismiss();
}
});
//将文案写到bitmap
private final Bitmap drawTextToBitmap(Bitmap bitmap, String text, Paint paint, int paddingLeft, int paddingTop) {
Bitmap.Config config = bitmap.getConfig();
paint.setDither(true);
paint.setFilterBitmap(true);
if (config == null) {
config = Bitmap.Config.ARGB_8888;
}
bitmap = bitmap.copy(config, true);
Canvas canvas = new Canvas(bitmap);
canvas.drawText(text, paddingLeft, paddingTop, paint);
return bitmap;
}
3.线程切换工具类
/**
* 切换线程的工具方法
* @param <UD>
* @return
*/
public final static <UD>ObservableTransformer<UD,UD> rxud(){
return new ObservableTransformer<UD, UD>() {
@NotNull
@Override
public ObservableSource<UD> apply(@NotNull Observable<UD> upstream) {
return upstream.subscribeOn(Schedulers.io())//给上面的代码分配异步线程
.observeOn(AndroidSchedulers.mainThread()) //给下面的代码分配同步线程
.map(new Function<UD, UD>() {
@Override
public UD apply(@NotNull UD ud) throws Exception {
Log.d("lpf", "apply: 对线程执行了切换操作");
return ud;
}
});
}
};
}
这个工具类,配合compose操作符号,可以方便的切换线程,因为应用二里边用到了,所以贴出来。
4.解决网路嵌套问题
RetrofitUtil.createRetrofit().create(IUserListener.class)
.registerAction(new RegisterRequest())//执行注册操作 耗时操作 这里是子线程
.compose(rxud())
.doOnNext(new Consumer<RegisterResponse>() {
@Override
public void accept(RegisterResponse registerResponse) throws Exception {
//执行了注册操作,更新UI 这里是主线程
}
}).observeOn(Schedulers.io()) //给下面的操作分配子线程
.flatMap(new Function<RegisterResponse, ObservableSource<LoginResponse>>() {
@Override
public ObservableSource<LoginResponse> apply(@NotNull RegisterResponse registerResponse) throws Exception {
//这里执行登录操作 耗时操作,这里是子线程
Observable<LoginResponse> loginResponseObservable = RetrofitUtil.createRetrofit().
create(IUserListener.class).loginAction(new LoginReqeust());
return loginResponseObservable;
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<LoginResponse>() {
@Override
public void accept(LoginResponse loginResponse) throws Exception {
//登录成功后,这里执行更新UI的操作 这里是主线程
}
});
这个场景是网络回调里边嵌套另外一个网络请求,使用rxJava可以在一个层进行处理,避免嵌套处理。
5.防抖动
RxView.clicks(btn_request).throttleFirst(2000, TimeUnit.MILLISECONDS).observeOn(Schedulers.io()).subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
wanAndroidApi.getProject();
}
});
使用RxView来防止btn_request这个控件在设置的时间里边响应多次的问题。
使用防抖动需要引入依赖库
扫描二维码关注公众号,回复:
14284955 查看本文章

implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1' // 操作功能防抖
6.RxJava 对Retrofit的封装
可以使用Rxjava对Retrofit进行封装。