欢迎Follow我的GitHub, 关注我的. 其余参考Android目录.

Demo

本文的合集已经编著成书,高级Android开发强化实战,欢迎各位读友的建议和指导。在京东即可购买:https://item.jd.com/12385680.html

Android

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

本文源码的GitHub下载地址

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的状态.

<?xml version="1.0" encoding="utf-8"?>    

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

OK, 使用响应式这种好用的异步编程方式吧.

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android使用ThreadLocal+PriorityQueue构建队列
  3. 活用Android线程间通信的Message机制
  4. Android可以在子线程更新UI吗
  5. RxJava 学习笔记(四)
  6. 【android】HandlerThread的使用及源码剖析
  7. android-----AsyncTask源码分析
  8. 面试总结(6):ScheduledExecutorService的使用
  9. Android(java)同步方法synchronized

随机推荐

  1. 五大Android旗舰机型触摸屏横向评测
  2. android中Selector中的相关属性及配置写
  3. Android的两种拍照方法
  4. android Thumbnail攻略
  5. Android OpenGL 编写简单滤镜
  6. Android之TextView属性列表
  7. Android Span的各种使用方法,简单、易懂、
  8. android适配不同分辨率的手机
  9. Android 之父的手机公司,关了
  10. Android 为 Android 开发访问 JAX-RS Web