Android rxjava

一.简介

RxJava是ReactiveX在JVM上的一个实现,ReactiveX使用Observable序列组合异步和基于事件的程序的库;是一个基于事件流、实现异步操作的库。RxJava在Java环境下使用,它通过Observable(可观测对象)和Subscriber(订阅者)来实现异步编程模型。Observable可以发射出一系列的数据流,而Subscriber则负责处理这些数据流。利用各种操作符,我们可以对数据流进行变换、过滤、合并等操作,从而完成复杂的异步任务。

rx == 反应式 reactivex == 响应式编程:根据上一层的响应影响下一层的变化

Observable被观察者理解为起点,Observer观察者理解为终点,通过Subscribe连接两者

二、简单使用

1.bulid.gradle

java 复制代码
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
// Because RxAndroid releases are few and far between, it is recommended you also
// explicitly depend on RxJava's latest version for bug fixes and new features.
// (see https://github.com/ReactiveX/RxJava/releases for latest 3.x.x version)
implementation 'io.reactivex.rxjava3:rxjava:3.1.5'

2.使用rxjava下载网络图片

java 复制代码
// 网络图片的链接地址
    private final static String PATH = "https://pixiv.re/103070121.jpg";

public void showImage() {
        //第二步
        //起点
        Observable.just(PATH)
                //第三步
                //图片下载需求
                .map(new Function<String, Bitmap>() {
                    @Override
                    public Bitmap apply(String path) throws Throwable {
                        try {

                            Thread.sleep(2000);
                            URL url = new URL(path);
                            //建立网络连接对象
                            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                            httpURLConnection.setConnectTimeout(5000);
                            int response = httpURLConnection.getResponseCode();
                            if (response == HttpURLConnection.HTTP_OK) {
                                InputStream inputStream = httpURLConnection.getInputStream();
                                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

                                return bitmap;
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        return null;
                    }
                })
                // 加水印
                .map(new Function<Bitmap, Bitmap>() {
                    @Override
                    public Bitmap apply(Bitmap bitmap) throws Throwable {
                        Paint paint = new Paint();
                        paint.setColor(Color.RED);
                        paint.setTextSize(10);
                        Bitmap syBitmap = drawTextToBitmap(bitmap,"pixiv",paint,50,10);
                        return syBitmap;
                    }
                })

                // 日志记录需求
                .map(new Function<Bitmap, Bitmap>() {
                    @NonNull
                    @Override
                    public Bitmap apply(@NonNull Bitmap bitmap) throws Exception {
                        Log.e("TAG", "什么时候下载了图片 apply: " + System.currentTimeMillis());
                        return bitmap;
                    }
                })

                //图片下载操作分配异步线程
                .subscribeOn(Schedulers.io())
                //终点分配Android主线程
                .observeOn(AndroidSchedulers.mainThread())
                
                .subscribe(
                    //终点
                    new Observer<Bitmap>() {
                    //第一步
                    //订阅成功
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        layout.setVisibility(View.VISIBLE);
                    }
                    
                    //第四步 显示图片
                    @Override
                    public void onNext(@NonNull Bitmap bitmap) {
                        image.setImageBitmap(bitmap);
                    }

                    //异常
                    @Override
                    public void onError(@NonNull Throwable e) {

                    }
                    
                    //第五步 结束
                    @Override
                    public void onComplete() {
                        if (progressDialog != null) {
                            layout.setVisibility(View.GONE);
                        }
                    }
                });
    }

个人理解太浅,详细使用请参考:

Rxjava3文档级教程一: 介绍和基本使用-CSDN博客

How To Use RxJava · ReactiveX/RxJava Wiki (github.com)

ReactiveX/RxJava: RxJava -- Reactive Extensions for the JVM -- a library for composing asynchronous and event-based programs using observable sequences for the Java VM. (github.com)

Observer (RxJava Javadoc 3.1.8) (reactivex.io)

相关推荐
Libraeking1 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位2 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen1233 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs4 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob4 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔4 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9964 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly6 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首7 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-19439 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed