Android-Rxjava在项目中的应用

Android-Rxjava 常用操作符

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这个控件在设置的时间里边响应多次的问题。

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

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

6.RxJava 对Retrofit的封装

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

猜你喜欢

转载自blog.csdn.net/u014078003/article/details/124518417