当前位置:   article > 正文

Android开发之RxJava使用_android rxjava

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增加网络权限

<uses-permission android:name="android.permission.INTERNET"/>
  • 1

代码示例,下面网络图片

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

<?xml version="1.0" encoding="utf-8"?>
<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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/177385
推荐阅读
相关标签
  

闽ICP备14008679号