RXJAVA学习笔记----从入门到精通

简介
Rxjava 是由微软架构师 Erik Meijer 领导的团队研发出来的开源库,目的是为了提供一个一致的编程接口,以便开发者对异步操作能够进行方便的处理。Rxjava 的设计是的开发者能通过 LINQ 的风格进行异步处理,所以它能将各种判断、循环、过滤、转换等的嵌套层级拉平,以流式的方式来编程,极大地简化了代码,增强了代码的阅读性。
RxJava 是一个用于 Java 编程语言的响应式扩展库。它通过异步数据流和观察者模式来处理异步事件。RxJava 的核心概念包括 Observable(可观察者)和 Observer(观察者),它们可以用于简化复杂的异步编程任务
RxJava 是 Reactive Extensions 的 Java 实现,用于异步编程,通过可观察的序列来简化并发操作和事件处理。它允许你使用声明式的方式来处理异步数据流和事件流。
**

RxJava核心原理讲解

**:
RxJava 是一个用于处理异步编程和事件驱动程序的库,其核心原理基于 ReactiveX(Reactive Extensions)的概念。要深入理解 RxJava 的核心原理,需要掌握以下几个关键概念和机制:

1. Observable 和 Observer

ObservableObserver 是 RxJava 的基础,分别表示可观察的事件源和事件的订阅者。

  • Observable:一个可以发射一系列事件的数据源。

    • onNext(T item):发射一个数据项。
    • onError(Throwable error):发射一个错误事件,并终止数据流。
    • onComplete():发射一个完成事件,表示数据流的结束。
  • Observer:一个接收和处理 Observable 发射的事件的对象。

    • onSubscribe(Disposable d):当 Observer 订阅 Observable 时调用。
    • onNext(T item):处理 Observable 发射的数据项。
    • onError(Throwable error):处理 Observable 发射的错误事件。
    • onComplete():处理 Observable 发射的完成事件。

2. Subscription 和 Disposable

SubscriptionDisposable 用于管理 ObservableObserver 之间的连接。

  • Subscription:表示 Observer 订阅了 Observable
  • Disposable:可以用来取消订阅,停止接收事件。

3. Schedulers

Schedulers 是调度器,用于指定代码执行的线程。常见的调度器包括:

  • Schedulers.io():用于 I/O 操作(网络请求、文件读写等)。
  • Schedulers.computation():用于 CPU 密集型计算。
  • Schedulers.newThread():为每个任务创建一个新线程。
  • Schedulers.single():在单个线程上运行。
  • AndroidSchedulers.mainThread():用于 Android 的主线程操作。

工作机制

1. Observable 的创建和订阅

Observable 可以通过多种方式创建,如 Observable.create()Observable.just()Observable.fromIterable() 等。创建 Observable 后,可以通过调用 subscribe() 方法来订阅它。

2. 事件的发射和处理

Observer 订阅 Observable 后,Observable 开始发射事件,Observer 处理接收到的事件。

Observable<String> observable = Observable.create(emitter -> {
    emitter.onNext("Hello");
    emitter.onNext("RxJava");
    emitter.onComplete();
});

Observer<String> observer = new Observer<String>() {
    @Override
    public void onSubscribe(Disposable d) {
        // 订阅时调用
    }

    @Override
    public void onNext(String s) {
        System.out.println(s);
    }

    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
    }

    @Override
    public void onComplete() {
        System.out.println("Completed");
    }
};

observable.subscribe(observer);

3. 操作符

操作符是 RxJava 的核心部分,用于变换、过滤和组合 Observable。操作符会创建一个新的 Observable,并将数据流从原始 Observable 传递到新 Observable

常见的操作符包括:

  • map:对每个数据项应用函数,返回一个新的数据项。
  • flatMap:将数据项转换为 Observable,然后将这些 Observable 合并成一个 Observable
  • filter:过滤掉不符合条件的数据项。
  • merge:合并多个 Observable 的数据项。
  • zip:将多个 Observable 的数据项按顺序组合。

4. 线程调度

RxJava 通过 Schedulers 来指定代码执行的线程。你可以使用 subscribeOnobserveOn 来控制 ObservableObserver 的执行线程。

Observable.just("Hello", "RxJava")
    .subscribeOn(Schedulers.io())  // 指定Observable运行的线程
    .observeOn(AndroidSchedulers.mainThread())  // 指定Observer运行的线程
    .subscribe(System.out::println);

5. 背压处理

背压处理是指在处理高频率数据流时,如何应对数据生产速度超过消费速度的问题。RxJava 2 引入了 Flowable 类来处理背压。

Flowable 支持的背压策略:

  • BUFFER:缓存所有数据项。
  • DROP:丢弃最新的数据项。
  • LATEST:只保留最新的数据项。
  • ERROR:当不能及时处理数据项时抛出异常。
Flowable.interval(1, TimeUnit.MILLISECONDS)
    .onBackpressureDrop()
    .observeOn(Schedulers.io())
    .subscribe(System.out::println, Throwable::printStackTrace);

结论

RxJava 是一个功能强大的异步编程库,通过 ObservableObserver 模型,结合操作符和调度器,使得处理复杂的异步操作变得更加简单和直观。掌握 RxJava 的核心原理和工作机制,可以帮助开发者编写高效、可读性强的异步代码。
**

RxJava demo演示

要演示 RxJava 的实际应用,下面是一个简单的 Java 项目示例,该项目将展示如何使用 RxJava 创建 Observable,订阅 Observer,以及使用操作符进行数据流的处理。我们还将展示如何在实际应用中进行网络请求。

环境配置

首先,确保你的项目已经配置好了 RxJava。你可以在你的 build.gradle 文件中添加以下依赖项:

dependencies {
    implementation 'io.reactivex.rxjava3:rxjava:3.1.3'
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}

示例代码

创建一个简单的 Observable 和 Observer

我们将首先创建一个简单的 Observable,它发射一些字符串数据,并且一个 Observer 订阅它来接收这些数据。

import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.observers.DisposableObserver;

public class RxJavaDemo {
    public static void main(String[] args) {
        // 创建一个Observable
        Observable<String> observable = Observable.create(emitter -> {
            emitter.onNext("Hello");
            emitter.onNext("RxJava");
            emitter.onComplete();
        });

        // 创建一个Observer
        DisposableObserver<String> observer = new DisposableObserver<String>() {
            @Override
            public void onNext(String s) {
                System.out.println("Received: " + s);
            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            @Override
            public void onComplete() {
                System.out.println("All items are emitted!");
            }
        };

        // 订阅Observable
        observable.subscribe(observer);
    }
}
使用操作符进行数据流处理

接下来,我们将使用一些操作符来变换和过滤数据。

import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.observers.DisposableObserver;

public class RxJavaDemo {
    public static void main(String[] args) {
        Observable.just("Hello", "RxJava", "World")
                .map(String::toUpperCase) // 将每个字符串转换为大写
                .filter(s -> s.length() > 4) // 过滤长度小于或等于4的字符串
                .subscribeWith(new DisposableObserver<String>() {
                    @Override
                    public void onNext(String s) {
                        System.out.println("Received: " + s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        e.printStackTrace();
                    }

                    @Override
                    public void onComplete() {
                        System.out.println("All items are emitted!");
                    }
                });
    }
}
网络请求示例

使用 Retrofit 和 RxJava 进行网络请求。

首先,定义一个 Retrofit API 接口:

import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.GET;
import retrofit2.http.Path;

public interface ApiService {
    @GET("users/{user}")
    Observable<User> getUser(@Path("user") String user);
}

接着,创建一个简单的 User 类:

public class User {
    private String login;
    private int id;
    private String avatar_url;

    // Getters and toString() method
    public String getLogin() {
        return login;
    }

    public int getId() {
        return id;
    }

    public String getAvatarUrl() {
        return avatar_url;
    }

    @Override
    public String toString() {
        return "User{" +
                "login='" + login + '\'' +
                ", id=" + id +
                ", avatar_url='" + avatar_url + '\'' +
                '}';
    }
}

最后,使用 Retrofit 和 RxJava 进行网络请求:

import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

public class RxJavaNetworkDemo {
    public static void main(String[] args) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.github.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
                .build();

        ApiService apiService = retrofit.create(ApiService.class);

        Observable<User> observable = apiService.getUser("octocat")
                .subscribeOn(Schedulers.io())
                .observeOn(io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.mainThread());

        observable.subscribe(new DisposableObserver<User>() {
            @Override
            public void onNext(User user) {
                System.out.println(user);
            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            @Override
            public void onComplete() {
                System.out.println("Request completed");
            }
        });
    }
}

这个示例演示了 RxJava 的基本用法,包括创建 Observable、使用操作符进行数据流处理,以及结合 Retrofit 进行网络请求。通过这些例子,你可以初步了解 RxJava 的强大功能和应用场景。继续深入学习,可以探讨更多高级特性和实际项目中的应用。

结语

**

RxJava 是一个强大的工具,可以显著提高异步编程的效率和可读性。通过学习和掌握 RxJava,你可以轻松地处理复杂的异步任务,编写更高效、更简洁的代码。希望这份简介能帮助你更好地理解和使用 RxJava

  • 30
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚安独角兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值