赞
踩
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(); } } }); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。