RxAndroid是RxJava的扩展, 优雅地处理异步请求. RxAndroid配合Lambda表达式, 精简处理回调, 使程序更具有可读性. Rx作为Android最优秀的开源库之一, 极大地提高生产力, 我们需要掌握. 本文由浅入深, 介绍一些常见的使用方法, 并附有源码.
本文代码的GitHub下载地址.
要点包含:
(1) 链式表达式的使用方式.
(2) Lambda的应用.
(3) Rx处理网络请求.
(4) 线程自动管理, 防止内存泄露.
(5) RxBinding绑定控件的异步事件.
基础
当然, 从一个崭新的HelloWorld项目开始.
添加Gradle配置.
1 2 3 |
compile 'com.jakewharton:butterknife:7.0.1' compile 'io.reactivex:rxandroid:1.1.0' // RxAndroid compile 'io.reactivex:rxjava:1.1.0' // 推荐同时加载RxJava |
RxAndroid是本文的核心依赖, 同时添加RxJava. 还有ButterKnife注解库.
Lambda表达式, 是写出优雅代码的关键, 参考.
1 2 3 4 5 6 7 8 9 10 11 12 |
plugins { id "me.tatarka.retrolambda" version "3.2.4" } android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } |
Gradle 2.1+
以上, 配置非常简单, 添加一个plugin和一个Java1.8兼容即可.
从主MainActivity
跳转至SimpleActivity
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/** * 主Activity, 用于跳转各个模块. * * @author wangchenlong */ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // 跳转简单的页面 public void gotoSimpleModule(View view) { startActivity(new Intent(this, SimpleActivity.class)); } // 跳转复杂的页面 public void gotoMoreModule(View view) { startActivity(new Intent(this, MoreActivity.class)); } // 跳转Lambda的页面 public void gotoLambdaModule(View view) { startActivity(new Intent(this, LambdaActivity.class)); } // 跳转网络的页面 public void gotoNetworkModule(View view) { startActivity(new Intent(this, NetworkActivity.class)); } // 跳转线程安全的页面 public void gotoSafeModule(View view) { startActivity(new Intent(this, SafeActivity.class)); } } |
在SimpleActivity
中, 创建一个观察者, 收到字符串的返回.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 观察事件发生 Observable.OnSubscribe mObservableAction = new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext(sayMyName()); // 发送事件 subscriber.onCompleted(); // 完成事件 } }; ... // 创建字符串 private String sayMyName() { return "Hello, I am your friend, Spike!"; } |
创建两个订阅者, 使用字符串输出信息.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// 订阅者, 接收字符串, 修改控件 Subscriber<String> mTextSubscriber = new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { mTvText.setText(s); // 设置文字 } }; // 订阅者, 接收字符串, 提示信息 Subscriber<String> mToastSubscriber = new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { Toast.makeText(SimpleActivity.this, s, Toast.LENGTH_SHORT).show(); } }; |
在页面中, 观察者接收信息, 发送至主线程AndroidSchedulers.mainThread()
, 再传递给订阅者, 由订阅者最终处理消息. 接收信息可以是同步, 也可以是异步.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simple); ButterKnife.bind(this); // 注册观察活动 @SuppressWarnings("unchecked") Observable<String> observable = Observable.create(mObservableAction); // 分发订阅信息 observable.observeOn(AndroidSchedulers.mainThread()); observable.subscribe(mTextSubscriber); observable.subscribe(mToastSubscriber); } |
更多
我们已经熟悉了初步的使用方式, 在接着学习一些其他方法, 如
just
: 获取输入数据, 直接分发, 更加简洁, 省略其他回调.
from
: 获取输入数组, 转变单个元素分发.
map
: 映射, 对输入数据进行转换, 如大写.
flatMap
: 增大, 本意就是增肥, 把输入数组映射多个值, 依次分发.
reduce
: 简化, 正好相反, 把多个数组的值, 组合成一个数据.
来看看这个示例, 设置两个不同类型数组, 作为输入源, 根据不同情况分发数据.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |