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