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'

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

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

修改AndroidManifest.xml增加网络权限

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

代码示例,下面网络图片

布局比较简单,就是一个按钮,一个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>

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();
                        }
                    }
                });
    }
}

参考

  • RxJava操作符汇总 https://blog.csdn.net/chuyouyinghe/article/details/122806097
  • https://github.com/ReactiveX/RxAndroid
  • https://github.com/ReactiveX/RxJava

猜你喜欢

转载自blog.csdn.net/wlddhj/article/details/127802534