• Android开发之RxJava使用


    RxJava是响应式编程,也可以理解为流式编程,核心是观察者模式。

    Rx是微软.Net的一个响应式扩展,Rx借助可观测的序列提供一种简单的方式来创建异步的,基于事件驱动的程序。2012年Netflix为了应对不断增长的业务需求开始将.NET Rx迁移到JVM上面。并于13年二月份正式向外展示了RxJava。

    使用RxJava可以是编程更加简洁、易懂,避免出现回调地狱。

    操作符说明

    参考 RxJava操作符汇总

    1、创建操作符:创建被观察者(Observable)对象&发送事件

    2、转换操作符:变换被观察者(Observable)发送的事件。将Observable发送的数据按照一定的规则做一些变换,然后再将变换的数据发射出去。变换的操作符有map,flatMap,concatMap,switchMap,buffer,groupBy等等。

    3、 合并操作符:组合多个被观察者(Observable)&合并需要发送的事件。包含:concatMap(),concat(), merge(),mergeArray(),concateArray(),reduce(),collect(),startWith(),zip(),count()等

    4、功能操作符:辅助被观察者(Observable) 发送事件时实现一些功能性需求,如错误处理,线程调度。

    5、过滤操作符:用于将Observable发送的数据进行过滤和选择。让Observable返回我们所需要的数据。过滤操作符有buffer(),filter(),skip(),take(),skipLast(),takeLast(),throttleFirst(),distainctUntilChange()。

    修改配置,增加依赖包

    implementation "io.reactivex.rxjava3:rxjava:3.1.5"
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
    
    • 1
    • 2

    下面例子演示了从网络上下载图片,并显示在页面上面,所以还需要添加OkHttp依赖,并增加网络权限

    implementation "com.squareup.okhttp3:okhttp:4.10.0"
    
    • 1

    修改AndroidManifest.xml增加网络权限

    
    
    • 1

    代码示例,下面网络图片

    布局比较简单,就是一个按钮,一个imageView

    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="点我加载图片"
            android:onClick="loadImage"
            />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageview"
            />
    LinearLayout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2)修改Activity类

    执行顺序如下:
    1、显示图片加载框
    2、起点,发送数据
    3、执行下载图片操作
    4、显示图片
    5、结束,隐藏加载框

    public class MainActivity extends AppCompatActivity {
    
        ActivityMainBinding binding;
        private ProgressDialog pg;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            binding = ActivityMainBinding.inflate(getLayoutInflater());
            setContentView(binding.getRoot());
        }
    
        public void loadImage(View view) {
            OkHttpClient okHttpClient = new OkHttpClient();
            String path = "https://www.dasouji.com/wp-content/uploads/2020/12/@ukwanghyun.jpg";
            // 2、起点,发送数据
            Observable.just(path)
                    // 3、执行下载图片操作
                    .map(new Function<String, Bitmap>() {
                        @Override
                        public Bitmap apply(String url) throws Throwable {
                            Request request = new Request.Builder().url(url).build();
                            Response response = okHttpClient.newCall(request).execute();
                            if (response.isSuccessful()) {
                                Bitmap bitmap = BitmapFactory.decodeStream(response.body().byteStream());
                                return bitmap;
                            }
                            return null;
                        }
                    })
                    // 给上面的操作分配异步线程
                    .subscribeOn(Schedulers.io())
    
                    // 给终点分配安卓主线程
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Bitmap>() {
                        // 1、显示图片加载框
                        @Override
                        public void onSubscribe(@NonNull Disposable d) {
                            pg = new ProgressDialog(MainActivity.this);
                            pg.setTitle("图片加载中...");
                            pg.show();
    
                        }
    
                        // 4、显示图片
                        @Override
                        public void onNext(@NonNull Bitmap bitmap) {
                            binding.imageview.setImageBitmap(bitmap);
                        }
    
                        @Override
                        public void onError(@NonNull Throwable e) {
    
                        }
    
                        // 5、结束,隐藏加载框
                        @Override
                        public void onComplete() {
                            if (pg != null) {
                                pg.dismiss();
                            }
                        }
                    });
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    参考

    • RxJava操作符汇总 https://blog.csdn.net/chuyouyinghe/article/details/122806097
    • https://github.com/ReactiveX/RxAndroid
    • https://github.com/ReactiveX/RxJava
  • 相关阅读:
    【ESP8266】烧录无线中继固件详细教学
    BI系统打包Docker镜像及部署的技术难度和实现
    Hadoop总结
    Python Web框架的三强之争:Flask、Django和FastAPI
    递归与递推
    SpringBoot 学习(三)Web 开发
    网站面临的主要漏洞和安全研究员发现问题
    图书管理系统的设计与实现/ssm的图书管理网站
    电脑访问不到在同网络的手机设备
    【Python】2D/3D框IOU简单计算方法
  • 原文地址:https://blog.csdn.net/wlddhj/article/details/127802534