Rx表示响应式编程, 使用观察者模式, 以观察者(Observer)和订阅者(Subscriber)为基础的异步响应方式. 在Android编程时, 经常会使用异步线程处理耗时任务, RxAndroid是比较优雅的选择.
目前的异步编程方式都会导致一些问题, 如1
2
3(1) Asynctasks can easily lead to memory leaks.
(2) CursorLoaders with a ContentProvider require a large amount of configuration and boilerplate code to setup.
(3) Services are intended for longer running background tasks and not fast-finishing operations, such as making a network call or loading content from a database.
RxAndroid来源于RxJava, 在RxJava的基础上扩展了一些Android的功能, 已经发布1.0版本, 让我们来看看怎么用吧.
本文源码的GitHub下载地址
欢迎Follow我的GitHub: https://github.com/SpikeKing
配置
新建一个HelloWorld程序. 配置build.gradle
, 添加RxAndroid库和Lamada表达式支持, 还有ButterKnife.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18plugins {
id "me.tatarka.retrolambda" version "3.2.2"
}
...
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
...
compile 'com.jakewharton:butterknife:7.0.1'
compile 'io.reactivex:rxandroid:1.0.1'
}
Lambda表达式支持不是必须的, 可以让你代码更加简洁, 减少匿名类的出现.
页面
页面很简单, 设置三个按钮, 触发耗时的线程操作, 分别用主线程, Asynctasks
, Rx方式调用, 观察ProcessBar的状态.
1 | <?xml version="1.0" encoding="utf-8"?> |
逻辑
添加一个阻塞任务, 执行5秒, 成功反馈.1
2
3
4
5
6
7
8
9
10// 长时间运行的任务
private String longRunningOperation() {
try {
Thread.sleep(5000);
} catch (Exception e) {
Log.e("DEBUG", e.toString());
}
return "Complete!";
}
主线程执行时, 会导致UI卡顿1
2
3
4
5
6
7// 线程运行
mThreadButton.setOnClickListener(v -> {
mThreadButton.setEnabled(false);
longRunningOperation();
Snackbar.make(mRootView, longRunningOperation(), Snackbar.LENGTH_LONG).show();
mThreadButton.setEnabled(true);
});
异步线程执行1
2
3
4
5
6
7
8
9
10
11
12
13// 异步线程
private class MyAsyncTasks extends AsyncTask<Void, Void, String> {
protected void onPostExecute(String s) {
Snackbar.make(mRootView, s, Snackbar.LENGTH_LONG).show();
mAsyncButton.setEnabled(true);
}
protected String doInBackground(Void... params) {
return longRunningOperation();
}
}
1 | // 异步运行 |
响应式方式执行, 使用IO线程处理, 主线程响应, 也可以使用其他线程处理, 如Schedulers.io()
处理IO的线程, Schedulers.computation()
计算的线程, Schedulers.newThread()
新创建的线程.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// 使用IO线程处理, 主线程响应
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext(longRunningOperation());
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
// 响应式运行
mRxButton.setOnClickListener(v -> {
mRxButton.setEnabled(false);
observable.subscribe(new Subscriber<String>() {
public void onCompleted() {
mRxButton.setEnabled(true);
}
public void onError(Throwable e) {
}
public void onNext(String s) {
Snackbar.make(mRootView, s, Snackbar.LENGTH_LONG).show();
}
});
});
使用响应式编程可以更好的处理内存泄露问题, 代码也更加优雅和可读, 选择执行线程和监听线程也更加方便. 在destroy时, 可以关闭正在执行的异步任务. 还有一些其他优势, 就参考其他吧. 使用响应式这种好用的异步编程方式吧.
OK, that’s all. Enjoy it!
原始地址:
http://www.wangchenlong.org/2016/03/19/1602/rxandroid-async/
欢迎Follow我的GitHub, 关注我的简书, 微博, CSDN, 掘金, Slides.
我已委托“维权骑士”为我的文章进行维权行动. 未经授权, 禁止转载, 授权或合作请留言.