RXjava

本文深入浅出地介绍了RxJava的基础概念与应用实践,通过具体的示例代码展示了如何利用RxJava进行事件处理、数据流操作及线程调度等高级功能。
JxAndroid
让复杂的程序逻辑回归简单 清晰,不用再考虑什么同步 异步的事情
observable(被观察者) Subscriber(订阅者)

- Observable可以是一个网络请求,Subscriber来显示请求结果;
- Observable可以是一个数据库查询,Subscriber来显示查询结果;
- Observable可以是按钮点击事件,Subscriber来响应点击事件;
- Observable可以是大图片文件的加载解析, Subscriber来展示解析后的图片。
* RxJava 的四个基本概念:
- 观察者设计模式
- Observable (可观察者/被观察者)
- subscribe (订阅)
- Event (事件)

RXjava操作符
* 操作符(Operators)(常用的)
- map 转换对象
- flatMap 平铺对象
- filter 过滤
- distinct() 去重复(独特的)
- take(int i) 从开始取出固定个数
- doOnNext 输出元素之前的额外操作(不常用)
- toList() 打包对象为集合

* 调度器(Scheduler), 用于线程控制
- Schedulers.immediate() 默认线程
- Schedulers.newThread() 每次都创建新的线程执行
- Schedulers.io() 包含线程池的机制, 线程个数无限, 可以复用空闲线程(常用)
- Schedulers.computation() CPU密集计算线程, 线程池线程数和CPU数一致.处理图形运算
- AndroidSchedulers.mainThread() Android更新界面的UI主线程(常用)
1.创建被观察者Observable
2.创建观察者Subscriber
3.二者管理.subscribe
4.释放资源

//创建被观察者,导包一定要小心,不要导成java包
//参数是一个对象,泛型代表了要发送的数据类型
Observable.create(new Observable.OnSubscribe<String>(){
});
//创建观察者
new Subscriber<String>(){
onNext();//被观察者发生改变时调用
onError();//方法有异常时回调
onCompleted();//当所有事件观察完毕时,事件结束回调的方法
}
//
.subscribe();

/*RxAndroid所依赖的库*/
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
just与from的区别:
just是对集合中整个数据进行观察
from RxAndroid接收一个集合对象,对其中数据一个一个观察,咱们用数据处理的功能




package com.example.demo_rxjava;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.Arrays;
import java.util.List;

import rx.Observable;
import rx.Subscriber;
import rx.functions.Action1;
import rx.functions.Func1;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//RXandroid的基本使用,用的是RxAndroid的观察者功能
//rxAndroidBse();

//RxAndroid接收一个集合对象,对其中数据一个一个观察,咱们用数据处理的功能
//rxAndroidFrmo();

//RxAndroid接收一个集合对象,对整个集合进行操作,观察整个集合
//RxAndroidJust();

//RxAndroid接收一个集合对象,对其中数据进行过滤
//RxAndroidFilterStream();

//RxAndroid接收一个集合对象,对其中数据进行转换
//RxAndroidMapStream();

//RxAndroid把拿到的数个集合,进行拆分观察
RxAndroidFlatMap();



}

private void RxAndroidFlatMap() {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> integers1 = Arrays.asList(6, 7, 8);
List<Integer> integers2 = Arrays.asList(9, 10);
Observable.just(integers,integers1,integers2)
//参数是集合,把整个集合输出
.flatMap(new Func1<List<Integer>, Observable<?>>() {
//他可以减少双层for循环的使用
@Override
public Observable<?> call(List<Integer> integers) {
return Observable.from(integers);
}
})
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
Log.d("texts", "onNext: "+o);
}
});

}

private void RxAndroidMapStream() {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Observable.from(integers)
//对集合的数据进行转换,参数里的泛型 1.代表了转换前的原始数据类型 2.代表了要转换的数据类型
//提示:你可以吧流转换为bitmap,文件 吧string或数据库cursor转换为Bean
.map(new Func1<Integer, String>() {
@Override
public String call(Integer integer) {
return integer.toString();
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d("texts", "onNext: "+s);
}
});
}

private void RxAndroidFilterStream() {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
//我是要每一个数据进行筛选,所以我们选择from
Observable.from(integers)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer % 2 == 0;
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.d("texts", "onNext: "+integer);
}
});
}

private void RxAndroidJust() {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
//创建被观察者 参数是一个集合 把整个集合一次性输出
Observable.just(integers)
.subscribe(new Action1<List<Integer>>() {
@Override
public void call(List<Integer> integers) {
Log.d("texts", "onNext: "+integers);
}
});
}

private void rxAndroidFrmo() {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
//创建被观察者 参数是一个集合 使用这种方法,会根据集合的长度,决定调用call的次数
Observable.from(integers)
//创建被观察者,立马就指定了观察者,如此就不用在进行注册绑定了
//如果你用不到onError onCompleted方法 就创建Action1 其中call == onNext方法
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.d("texts", "onNext: "+integer);
}
});
}

private void rxAndroidBse() {
//创建被观察者,导包一定要小心,不要导成java包
//参数是一个对象,泛型代表了要发送的数据类型
Observable<String> stringObservable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("你好世界");
}
});
//创建观察者
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {//当所有事件观察完毕时,事件结束回调的方法
Log.d("texts", "onCompleted: ");
}

@Override
public void onError(Throwable e) {//方法有异常时回调
Log.d("texts", "onError: ");
}

@Override
public void onNext(String s) {//被观察者发生改变时调用
Log.d("texts", "onNext: " + s);
}
};
//把观察者注册到被观察者
stringObservable.subscribe(subscriber);
}
}

4.释放资源

03-21
### 关于 RxJava 的使用指南和教程 #### 什么是 RxJavaRxJava 是一种基于响应式编程(Reactive Programming)的库,用于处理异步数据流。它通过观察者模式简化了复杂的异步操作,并提供了丰富的操作符来组合、转换和过滤数据流。 --- #### RxJava 的基本概念 RxJava 的核心组件包括以下几个部分: - **Observable/Flowable**: 数据源,表示可被订阅的数据流。 - **Observer/Subscriber**: 订阅者,接收来自 Observable 或 Flowable 的通知。 - **onNext()**: 接收正常的数据项。 - **onError()**: 处理错误情况。 - **onComplete()**: 表示数据流结束[^2]。 --- #### 如何开始使用 RxJava? ##### 添加依赖 要使用 RxJava,在项目的 `build.gradle` 文件中添加以下依赖: ```gradle implementation 'io.reactivex.rxjava3:rxjava:3.1.5' implementation 'io.reactivex.rxjava3:rxandroid:3.0.0' ``` 注意:上述版本号可能随时间更新,请查阅官方文档获取最新版本[^4]。 --- #### 基本使用方式 ###### 方法一:分步骤实现 这是为了深入了解 RxJava 的工作原理。以下是具体的步骤: 1. 创建一个 Observable 对象。 2. 定义 Observer 来监听事件。 3. 调用 subscribe() 方法将两者连接起来。 代码示例: ```java // 步骤1:创建Observable对象 Observable<String> observable = Observable.just("Hello", "World"); // 步骤2:定义Observer Observer<String> observer = new Observer<String>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(String value) { System.out.println(value); } @Override public void onError(Throwable e) { e.printStackTrace(); } @Override public void onComplete() { System.out.println("Completed"); } }; // 步骤3:建立订阅关系 observable.subscribe(observer); ``` ###### 方法二:链式调用 这种方式更适合实际项目中的简洁性和高效性。可以通过链式调用来完成复杂的操作: 代码示例: ```java Observable.just("Hello", "World") .map(s -> s.toUpperCase()) // 将字符串转为大写 .subscribe(System.out::println); // 输出结果 ``` --- #### 组合与合并操作符详解 RxJava 提供了许多强大的操作符来帮助开发者灵活地处理数据流。常见的组合与合并操作符如下: 1. **merge():** 合并多个 Observables 并保持顺序不固定[^1]。 ```java Observable.merge(Observable.just(1, 2), Observable.just(3, 4)) .subscribe(System.out::println); ``` 2. **concat():** 类似 merge,但会按顺序依次发射数据。 ```java Observable.concat(Observable.just(1, 2), Observable.just(3, 4)) .subscribe(System.out::println); ``` 3. **zip():** 将多个 Observables 发射的数据按照指定的方式组合在一起。 ```java Observable.zip( Observable.just("A", "B"), Observable.just("C", "D"), (s1, s2) -> s1 + "-" + s2) .subscribe(System.out::println); ``` --- #### Retrofit 结合 RxJava 使用 Retrofit 和 RxJava 可以很好地配合使用,从而简化网络请求流程。首先需要配置 Retrofit 支持 RxJava: 代码示例: ```java Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) .build(); // 定义接口 interface ApiService { @GET("/data") Observable<List<Data>> getData(); } ApiService apiService = retrofit.create(ApiService.class); // 执行请求 apiService.getData().subscribe(dataList -> { dataList.forEach(item -> System.out.println(item)); }, throwable -> { throwable.printStackTrace(); }); ``` --- #### 更多资源推荐 如果想进一步学习 RxJava,可以参考以下资料: - Carson_Ho 的《Android RxJava 实际应用教学》[^3]。 - 一份详细的 RxJava 学习指南[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值