RxJava在Android的应用场景

导入

//rxjava
compile 'io.reactivex:rxjava:latest.release'
//rxAndroid
compile 'io.reactivex:rxandroid:latest.release'
//rxLifecycle
compile 'com.trello:rxlifecycle:latest.release'
compile 'com.trello:rxlifecycle-components:latest.release'
compile 'com.trello:rxlifecycle-android:latest.release'

使用RxLifecycle

为什么要使用RxLifecycle?虽然rxjava使用起来,但是过度使用不释放的话就会产生内存泄漏,RxLifeCycle可以帮助我们在组件生命周期的某个阶段或者指定事件发生时自动取消订阅,其项目地址在:https://github.com/trello/RxLifecycle(RxLifecycle的最低API是14)

使用方法也很简单:

  1. 继承RxAppCompatActivity或者RxLifecycle其他提供的类,根据需要选择
  2. 使用bindUntilEvent方法来绑定生命周期
//1. 需要继承对应的RxAppCompatActivity
public class MainActivity extends RxAppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //在onCreate()中绑定,将在对应的onDestory()中解除订阅关系
        Observable.interval(5, TimeUnit.SECONDS).
                compose(bindUntilEvent(ActivityEvent.DESTROY))
                .doOnUnsubscribe(() ->{
                        Log.d("MainActivity", "解除订阅");}
                ).subscribe(aLong -> {
                Log.d("MainActivity", "start task:" + Thread.currentThread().getName());
        });
    }

}

场景1:View的点击事件

 RxView.clicks(TextView)
.compose(bindUntilEvent(ActivityEvent.DESTROY)).subscribe(aVoid -> {
                   ...do some things
                });

场景2:使用throttleFirst防止按钮重复点击

比如在某些情况下,点击了某个按钮进行网络请求或者进入下个按钮,但是这个操作可能不是立马显现出结果,用户以为无响应而多次点击Button或者恶意快速点击的情况下,这个时候我们就可以使用throttleFirst来解决这个问题,所以上面的例子可以改为:

RxView.clicks(TextView)
.compose(bindUntilEvent(ActivityEvent.DESTROY))
 .throttleFirst(1L,TimeUnit.SECONDS).subscribe(aVoid -> {
                   ...do some things
                });

场景3:View相关的响应式操作

比如要对EditeText的输出监听,可以使用RxTextView.textChanges,还有更多操作可以查看RxBinding项目说明即可:https://github.com/JakeWharton/RxBinding。

 //绑定输入view事件
        RxTextView.textChanges(EditeText).compose(bindUntilEvent(ActivityEvent.DESTROY))
                .subscribe(charSequence -> {
            ...do some things
        });

场景4:interval周期任务

如果我们需要周期性执行某个任务,可以使用rxjava的interval

 Observable.interval(5, TimeUnit.SECONDS).subscribe(aLong -> {
                ...do some things
        });

这段代码表示每5秒执行某个操作;

场景4:timer定时任务

在一些情况下我们需要执行定时任务,在Rxjava里我们可以使用timer

Observable.timer(2, TimeUnit.SECONDS).subscribe(aLong -> {
              ...do some things   
        });

场景5: Scheduler线程切换

比如我们需要做某些耗时操作需要在一个新的线程里进行,结果返回到主线程里:

Observable.just(1, 2, 3, 4)  
            .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程  
            .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程  
            .subscribe(number ->{
              ...do some things   
            }); 

场景6:与retrofit结合使用

使用rxjava与retrofit来做网络请求会大大的节省了你很多,比如你可以很轻松的进行线程切换,数据转换什么的等;具体参考这篇: RxJava 与 Retrofit 结合的最佳实践 文章;

场景7: 使用RxBus来代替EventBus、otto

RxBus并不是一个库,而是一种模式,是使用了RxJava的思想来达到EventBus的数据传递效果,可以以下文章来自己实现RxBus:

  1. http://blog.kaush.co/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/
  2. http://blog.csdn.net/a1018875550/article/details/52083187

场景8:使用schedulePeriodically做轮询请求

Observable.create(new Observable.OnSubscribe<String>() {  
            @Override  
            public void call(final Subscriber<? super String> observer) {  

                Schedulers.newThread().createWorker()  
                      .schedulePeriodically(new Action0() {  
                          @Override  
                          public void call() {  
                              observer.onNext(doNetworkCallAndGetStringResult());  
                          }  
                      }, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS);  
            }  
        }).subscribe(s ->{
           ...do some things   
        }); 

你可能感兴趣的:(android,rxjava)