频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
RxAndroid简述
2015-11-09 13:37:18         来源:Mystra  
收藏   我要投稿

Rx是响应式编程的意思, 本质是观察者模式, 是以观察者(Observer)和订阅者(Subscriber)为基础的异步响应方式. 在Android编程时, 经常会使用后台线程, 那么就可以使用这种方式. 目前的异步编程方式都会导致一些问题, 如

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

 

1. 准备

新建一个HelloWorld程序. 配置build.gradle, 添加RxAndroid库和Lamada表达式支持, 还有ButterKnife.

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表达式支持不是必须的, 可以让你代码更加简洁, 减少匿名类的出现.

2. 页面

页面很简单, 设置三个按钮, 触发耗时的线程操作, 分别用主线程, Asynctasks, Rx方式调用, 观察ProcessBar的状态.


3. 逻辑

添加一个阻塞任务, 执行5秒, 成功反馈.

    // 长时间运行的任务
    private String longRunningOperation() {
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
            Log.e(DEBUG, e.toString());
        }

        return Complete!;
    }

主线程执行时, 会导致UI卡顿

        // 线程运行
        mThreadButton.setOnClickListener(v -> {
            mThreadButton.setEnabled(false);
            longRunningOperation();
            Snackbar.make(mRootView, longRunningOperation(), Snackbar.LENGTH_LONG).show();
            mThreadButton.setEnabled(true);
        });

异步线程执行

    // 异步线程
    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();
        }
    }
        // 异步运行
        mAsyncButton.setOnClickListener(v -> {
            mAsyncButton.setEnabled(false);
            new MyAsyncTasks().execute();
        });

响应式方式执行, 使用IO线程处理, 主线程响应, 也可以使用其他线程处理, 如Schedulers.io()处理IO的线程, Schedulers.computation()计算的线程, Schedulers.newThread()新创建的线程.

        // 使用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时, 可以关闭正在执行的异步任务. 还有一些其他优势, 就参考网站吧.

 

点击复制链接 与好友分享!回本站首页
相关TAG标签
上一篇:Android基础入门教程——9.2 MediaPlayer播放音频与视频
下一篇:Android 左右侧滑示例
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站