Android-Rxjava 常用操作符

1.应用场景 延时执行操作 默认是子线程 可以通过observeOn 切换的是观察者的执行线程

Observable.just(1).delay(2000,TimeUnit.MILLISECONDS)

// .observeOn(AndroidSchedulers.mainThread())

.subscribe(new Consumer() {

@Override

public void accept(Object o) throws Exception {

Log.e("lpf","延时执行--"+Thread.currentThread().getName());

}

});

默认观察者在子线程执行,使用observeOn控制线程操作。

2.执行网络耗时操作,并对数据进行变换操作

Observable.just(PATH).map(new Function() {

@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() {

@Override

public Bitmap apply(@NotNull Bitmap bitmap) throws Exception {

Log.d("lpf", "apply: 是这个时候下载了图片啊:" + System.currentTimeMillis());

return bitmap;

}

}).map(new Function() {

@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() {

@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

* @return

*/

public final static ObservableTransformer rxud(){

return new ObservableTransformer() {

@NotNull

@Override

public ObservableSource apply(@NotNull Observable upstream) {

return upstream.subscribeOn(Schedulers.io())//给上面的代码分配异步线程

.observeOn(AndroidSchedulers.mainThread()) //给下面的代码分配同步线程

.map(new Function() {

@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() {

@Override

public void accept(RegisterResponse registerResponse) throws Exception {

//执行了注册操作,更新UI 这里是主线程

}

}).observeOn(Schedulers.io()) //给下面的操作分配子线程

.flatMap(new Function>() {

@Override

public ObservableSource apply(@NotNull RegisterResponse registerResponse) throws Exception {

//这里执行登录操作 耗时操作,这里是子线程

Observable loginResponseObservable = RetrofitUtil.createRetrofit().

create(IUserListener.class).loginAction(new LoginReqeust());

return loginResponseObservable;

}

}).observeOn(AndroidSchedulers.mainThread())

.subscribe(new Consumer() {

@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() {

@Override

public void accept(Object o) throws Exception {

wanAndroidApi.getProject();

}

});

使用RxView来防止btn_request这个控件在设置的时间里边响应多次的问题。

使用防抖动需要引入依赖库

implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1' // 操作功能防抖

6.RxJava 对Retrofit的封装

可以使用Rxjava对Retrofit进行封装。

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: 

发表评论

返回顶部暗黑模式