RxAndroid 处理异步任务

[复制链接]
来自: MrlLee 分类: Android精品源码 上传时间: 2016-4-21 19:47:24
Tag:RxAndroid 处理 异步 任务

项目介绍:

Rx表示响应式编程, 使用观察者模式, 以观察者(Observer)和订阅者(Subscriber)为基础的异步响应方式. 在Android编程时, 经常会使用异步线程处理耗时任务, RxAndroid是比较优雅的选择.
目前的异步编程方式都会导致一些问题, 如
[Java] 查看源文件 复制代码
(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版本, 让我们来看看怎么用吧.

使用 RxAndroid 处理异步任务

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版本, 让我们来看看怎么用吧.


配置
新建一个HelloWorld程序. 配置build.gradle, 添加RxAndroid库和Lamada表达式支持, 还有ButterKnife.
[XML] 查看源文件 复制代码
plugins {
    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的状态.
[XML] 查看源文件 复制代码



    
逻辑
添加一个阻塞任务, 执行5秒, 成功反馈.
[XML] 查看源文件 复制代码
// 长时间运行的任务
private String longRunningOperation() {
    try {
        Thread.sleep(5000);
    } catch (Exception e) {
        Log.e("DEBUG", e.toString());
    }

    return "Complete!";
}
主线程执行时, 会导致UI卡顿
[Java] 查看源文件 复制代码
// 线程运行
mThreadButton.setOnClickListener(v -> {
    mThreadButton.setEnabled(false);
    longRunningOperation();
    Snackbar.make(mRootView, longRunningOperation(), Snackbar.LENGTH_LONG).show();
    mThreadButton.setEnabled(true);
});
异步线程执行
[Java] 查看源文件 复制代码
// 异步线程
private class MyAsyncTasks extends AsyncTask {
    @Override
    protected void onPostExecute(String s) {
        Snackbar.make(mRootView, s, Snackbar.LENGTH_LONG).show();
        mAsyncButton.setEnabled(true);
    }

    @Override
    protected String doInBackground(Void... params) {
        return longRunningOperation();
    }
}
[Java] 查看源文件 复制代码
// 异步运行
mAsyncButton.setOnClickListener(v -> {
    mAsyncButton.setEnabled(false);
    new MyAsyncTasks().execute();
});
响应式方式执行, 使用IO线程处理, 主线程响应, 也可以使用其他线程处理, 如Schedulers.io()处理IO的线程, Schedulers.computation()计算的线程, Schedulers.newThread()新创建的线程.
[Java] 查看源文件 复制代码
// 使用IO线程处理, 主线程响应
Observable observable = Observable.create(new Observable.OnSubscribe() {
    @Override
    public void call(Subscriber subscriber) {
        subscriber.onNext(longRunningOperation());
        subscriber.onCompleted();
    }
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());

// 响应式运行
mRxButton.setOnClickListener(v -> {
    mRxButton.setEnabled(false);
    observable.subscribe(new Subscriber() {
        @Override
        public void onCompleted() {
            mRxButton.setEnabled(true);
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(String s) {
            Snackbar.make(mRootView, s, Snackbar.LENGTH_LONG).show();
        }
    });
});
使用响应式编程可以更好的处理内存泄露问题, 代码也更加优雅和可读, 选择执行线程和监听线程也更加方便. 在destroy时, 可以关闭正在执行的异步任务. 还有一些其他优势, 就参考其他吧. 使用响应式这种好用的异步编程方式吧.


相关源码推荐:

我来说两句
所有评论(4)
SunE25 2016-6-16 18:05:47
感谢分享,mark!
回复
fangke557 2016-6-16 18:09:08
学习学习,很有用,感谢~
回复
qming102 2016-6-16 18:19:53
楼主V5,安卓巴士有你更精彩!
回复
xzxzhao2013 2017-2-10 14:10:19
楼主用心了,内容非常精彩。
回复
提取码:  下载次数:1 状态:已购或VIP 售价:10(原价:10)金钱 下载权限:初级码农 
1514 0 1
代码贡献英雄榜
用户名 下载数
联系我们
首页/微信公众账号投稿
帖子代码编辑/版权问题
QQ:435399051,1294855032
如何获得代码达人称号?
如何成为签约作者?
领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )