• RxJava入门


    参考文档

    RxJava-Android开发_Essentials中文翻译版_官方中文版-Android文档类资源-CSDN下载

    包含:

    Android开发-RxJava详解.pdf(偏向于Android开发的指导)

    RxJava Essentials_中文翻译版.pdf(国外大牛Ivan.Morgillo编写的RxJava教程)

    RxJava官方中文文档.pdf(比较全面,包含所有操作符的说明。这是RxJava1的文档,目前通常使用RxJava2,RxJava2基于RxJava1扩充了操作符和少量修改,整体用法和思维是一致的)

    1 RxJava基本介绍

    1.1 概念

            RxJava是采用响应式编程思想的异步操作框架,设计初衷是让异步编程变得简洁,灵活。Android 提供的 AsyncTask 和Handler ,其实都是为了让异步代码更加简洁(逻辑简洁)。 RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁(逻辑简洁),这得益于RxJava编码特征:减少嵌套、多采用链式调用,简化代码逻辑。

     

    1.2 内容概括

            两个对象 + 操作符

    两个对象:被观察者、观察者

    操作符(方法):

    • 创建操作:create、defer、empty/never/throw、from、interval、just、range、repeat、start、timer
    • 变换操作:buffer、flatMap、groupBy、map、scan、window
    • 过滤操作:debounce、distinct、elementAt、filter、first、ignoreElements、Last、Sample、Skip、SkipLast、Take、TakeLast
    • 结合操作:and/then/when、combineLatest、join、merge、startWith、switch、zip
    • 错误处理:catch、retry
    • 辅助操作:delay、do、materialize/dematerialize、observeOn、serialize、subscribe、subscribeOn、timeInterval、timeout、timestamp、using、to
    • 条件和布尔操作:all/contains/amb、defaultEmpty、SequenceEqual、skipUntil/skipWhile、takeUntil/TakeWhile
    • 算数和聚合操作:average/concat/reduce、max/min/count/sum
    • 异步操作:start、toAsync、、、
    • 连接操作:connect、publish、refCount、replay
    • 转换操作:toFuture、、、
    • 阻塞操作:forEach、、、
    • 字符串操作:byLine、docede、、、

    2 使用案例解析

    2.1 操作符just、map组合

    2.1.1 场景描述

            输入网络图片路径path(String),通过网络请求获取原图Bitmap,然后裁剪Bitmap,并且转成Drawable。最后给文字添加背景图片Drawable。

    2.1.2 主要代码

    1. private void doRxJava1(String path) {
    2. Log.d(TAG, "doRxJava1: start");
    3. Observable.just(path)
    4. // 需求1:获取图片
    5. .map(new Function<String, Bitmap>() {
    6. @Override
    7. public Bitmap apply(@NonNull String path) throws Exception {
    8. Log.d(TAG, "io线程 apply需求1:正在获取网络图片,需要3秒...");
    9. // String --> Bitmap
    10. Bitmap bitmap = obtainPictureByHttp(path);
    11. return bitmap;
    12. }
    13. })
    14. // 需求2:裁剪图片
    15. .map(new Function<Bitmap, Drawable>() {
    16. @Override
    17. public Drawable apply(@NonNull Bitmap bitmap) throws Exception {
    18. Log.d(TAG, "io线程 apply需求2:裁剪图片");
    19. // Bitmap --> Drawable
    20. Drawable drawable = cropPicture(bitmap);
    21. return drawable;
    22. }
    23. })
    24. // .map(todo 实现更多需求)
    25. .subscribeOn(Schedulers.io())
    26. .observeOn(AndroidSchedulers.mainThread())
    27. .subscribe(new Observer<Drawable>() {
    28. @Override
    29. public void onSubscribe(@NonNull Disposable d) {
    30. Log.d(TAG, "调用subscribe的线程 onSubscribe: ");
    31. }
    32. @Override
    33. public void onNext(@NonNull Drawable drawable) {
    34. Log.d(TAG, "main线程 onNext: 设置背景图片" + drawable);
    35. mTextView.setBackground(drawable);
    36. }
    37. @Override
    38. public void onError(@NonNull Throwable e) {
    39. Log.d(TAG, "main线程 onError: ");
    40. }
    41. @Override
    42. public void onComplete() {
    43. Log.d(TAG, "main线程 onComplete: 过程结束");
    44. }
    45. });
    46. }
    47. //********************************************************************************
    48. //模拟耗时操作,获取网络图片:String --> Bitmap
    49. private Bitmap obtainPictureByHttp(String path) {
    50. try {
    51. Thread.sleep(3000);
    52. } catch (InterruptedException e) {
    53. e.printStackTrace();
    54. }
    55. Drawable drawable = getDrawable(R.drawable.picture1);
    56. Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
    57. return bitmap;
    58. }
    59. //裁剪图片: Bitmap --> Drawable
    60. private Drawable cropPicture(Bitmap bitmap) {
    61. // ...
    62. Drawable drawable = new BitmapDrawable(bitmap);
    63. return drawable;
    64. }

    2.1.3 测试结果

     2.1.4 解析

    just(T...): 将传入的参数依次发送出来

    map( ) — 对序列的每一项都应用一个函数来变换Observable发射的数据序列

    2.2 操作符create

    2.2.1 场景描述

            初次获取网络文本,并显示,3秒后,再次获取网络文本,并显示。

    2.2.2 主要代码

    1. private void doRxJava2(String path) {
    2. Log.d(TAG, "doRxJava2: start");
    3. Observable.create(new ObservableOnSubscribe<String>() { // 所有泛型一致
    4. @Override
    5. public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
    6. Log.d(TAG, "io线程 apply操作1:正在获取网络文本text111");
    7. emitter.onNext("text111");
    8. Thread.sleep(3000);
    9. Log.d(TAG, "io线程 apply操作2:正在获取网络文本text222");
    10. emitter.onNext("text222");
    11. emitter.onComplete();
    12. }
    13. })
    14. .subscribeOn(Schedulers.io())
    15. .observeOn(AndroidSchedulers.mainThread())
    16. .subscribe(new Observer<String>() {
    17. @Override
    18. public void onSubscribe(@NonNull Disposable d) {
    19. Log.d(TAG, "调用subscribe的线程 onSubscribe: ");
    20. }
    21. @Override
    22. public void onNext(@NonNull String text) {
    23. Log.d(TAG, "main线程 onNext: 设置文本" + text);
    24. mTextView.setText(text);
    25. }
    26. @Override
    27. public void onError(@NonNull Throwable e) {
    28. Log.d(TAG, "main线程 onError: ");
    29. }
    30. @Override
    31. public void onComplete() {
    32. Log.d(TAG, "main线程 onComplete: 过程结束");
    33. }
    34. });
    35. }

    2.2.3 测试结果

    2.3 操作符flatMap、filter、map组合

    2.3.1 场景描述

            界面上有一个自定义的视图 imageCollectorView ,它的作用是显示多张图 片,并能使用 addImage(Bitmap) 方法来任意增加显示的图片。现在需要程序将一个给出的目录数 组 File[] folders 中每个目录下的 png 图片都加载出来并显示在 imageCollectorView 中。需要注意 的是,由于读取图片的这一过程较为耗时,需要放在后台执行,而图片的显示则必须在 UI 线程执行

    2.3.2 主要代码(直接用java多线程)

    1. new Thread() {
    2. @Override
    3. public void run() {
    4. super.run();
    5. for (File folder : folders) {
    6. File[] files = folder.listFiles();
    7. for (File file : files) {
    8. if (file.getName().endsWith(".png")) {
    9. final Bitmap bitmap = getBitmapFromFile(file);
    10. getActivity().runOnUiThread(new Runnable() {
    11. @Override
    12. public void run() {
    13. imageCollectorView.addImage(bitmap);
    14. }
    15. });
    16. }
    17. }
    18. }
    19. }
    20. }.start();

    2.3.3 主要代码(采用RxJava) 

    1. private void showPictures(File[] folders) {
    2. Observable.fromArray(folders)
    3. .flatMap(new Function<File, Observable<File>>() {
    4. @Override
    5. public Observable<File> apply(File file) {
    6. return Observable.fromArray(file.listFiles());
    7. }
    8. })
    9. .filter(new Predicate<File>() {
    10. @Override
    11. public boolean test(@NonNull File file) throws Exception {
    12. return file.getName().endsWith(".png");
    13. }
    14. })
    15. .map(new Function<File, Bitmap>() {
    16. @Override
    17. public Bitmap apply(File file) {
    18. return getBitmapFromFile(file);
    19. }
    20. })
    21. .subscribeOn(Schedulers.io())
    22. .observeOn(AndroidSchedulers.mainThread())
    23. .subscribe(new Observer<Bitmap>() {
    24. @Override
    25. public void onSubscribe(@NonNull Disposable d) {}
    26. @Override
    27. public void onNext(@NonNull Bitmap bitmap) {
    28. imageCollectorView.addImage(bitmap);
    29. }
    30. @Override
    31. public void onError(@NonNull Throwable e) {}
    32. @Override
    33. public void onComplete() { }
    34. });
    35. }

    2.4 取消订阅

    每天记录学习的新知识 :Disposable和CompositeDisposable_清风徐来辽的博客-CSDN博客Disposable1.简介:rxjava虽然好用,但是总所周知,容易遭层内存泄漏。也就说在订阅了事件后没有及时取阅,导致在activity或者fragment销毁后仍然占用着内存,无法释放。而disposable便是这个订阅事件,可以用来取消订阅。2.方法调用:2.1.主动解除订阅dispose():2.2查询是否解除订阅 true 代表 已经解除订阅isDisposed():...https://blog.csdn.net/weixin_35691921/article/details/104992346

    2.5 线程切换

    observeOn()与subscribeOn()用于切换线程

    observeOn()与subscribeOn()的详解_江东橘子的博客-CSDN博客_subscribeon和observeonRxjava 提供了subscribeOn()方法来用于每个observable对象的操作符在哪个线程上运行Rxjava 提供了ObserveOn()方法来用于每个Subscriber(Observer)对象的操作符在哪个线程上运行线程切换的时候subscribeOn()只被执行一次 。如果出现多次,那么以第一次出现是用的那个线程为准。 ObserverOnobsehttps://blog.csdn.net/michael1112/article/details/78688099

  • 相关阅读:
    PDF文件如何设置密码保护?
    lighttpd cgi不能重启
    vue获取当前日期以及当前日期为基点获取任何日期,超省事
    国际海运详解:国际海运的发货方式有哪些?区别是什么?
    推荐收藏,机器学习7种特征编码太好用了
    Spring Cloud Alibaba【OpenFeign实现服务降级、Dubbo实现服务生产者、 Dubbo消费者调用接口 】(三)
    编写一个函数,要求输入任意两个无符号32位整形数,在控制台打印两个数相加的结果,要求禁止使用64位变量
    基于国产 ARM + FPGA+Codesys运动控制平台的智能人机交互系统设计
    ROS 代码调试常用方式配置
    汽车OTA测试思考与实践
  • 原文地址:https://blog.csdn.net/qq_38861828/article/details/125515672