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

代码示例,下面网络图片

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

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">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="点我加载图片"

android:onClick="loadImage"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/imageview"

/>

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() {

@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() {

// 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/122806097https://github.com/ReactiveX/RxAndroidhttps://github.com/ReactiveX/RxJava

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: