前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RxAndroid从零开始学习之一(RxJava的简单Demo)

RxAndroid从零开始学习之一(RxJava的简单Demo)

作者头像
Frank909
发布2019-01-14 17:19:09
2.3K0
发布2019-01-14 17:19:09
举报
文章被收录于专栏:Frank909Frank909

前言

现在RxJava,RxAndroid似乎很火,很多开发群里面都在讨论。因为本人虽然一直在开发Android,但近两年跟系统内置app和framework层打交道更多,没有想到脱离互联网领域这么点时间,这么多新技术就冒出来了。所以想想很有危机感,感觉脱离群众很久了。那么,来吧。打算用一段时间将这个知识点从零开始学起。

至于RxAndroid其实只是RxJava的一个扩展,它在RxJava的基础上添加了一些针对Android系统的新API。因为我是在Android系统上编写代码测试,所以我就将之称呼为RxAndroid了。其实大多讲得基本上都是RxJava的知识点。这点需要大家注意。

本人偏向于实用主义,不想开山立作去详尽解释RxAndroid中具体的语法,只想通过自己编写的demo去一个一个验证知识点

好吧。开始。

RxJava是用来解决异步工作问题的,在Android中特别恼火的多线程开发问题上游刃有余,所以才深受广大开发者的喜欢。RxAndroid基于RxJava。

RxAndroid的Github地址是 link

如果需要在开发中用到RxAndroid,那么需要在 Android Studio中添加依赖 build.gradle中的

代码语言:javascript
复制
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile 'io.reactivex:rxandroid:1.2.1'
    // Because RxAndroid releases are few and far between, it is recommended you also
    // explicitly depend on RxJava's latest version for bug fixes and new features.
   compile 'io.reactivex:rxjava:1.1.6'

}

Observable,Subscribers

开发的人都知道监听者模式,订阅模式这些概念。而Observable和Subscribers的英文意思就是如此。我们大概也知道差不多和监听者模式差不多。

  • Observable事件源,被观察者。
  • Subcriblers 观察者,事件订阅者
  • Observer 同Subcribler差不多
  • subscribe() 方法,绑定Observable与Subcribler或者Observabler

很显然,Observable对象发生动静,然后通信Subcribers,然后Subcribers实现自己的业务逻辑。

Observable的创建

Observable

它没有一个public的构造器,看源码可知它创建的对象的方法原型如下:

代码语言:javascript
复制
public final static <T> Observable<T> create(OnSubscribe<T> f) {
        return new Observable<T>(hook.onCreate(f));
    }

可以看见,它是静态方法,接受一个OnSubscribe的参数,我们先不管它是什么,我们一步一步来,先创建一个对象再说。

代码语言:javascript
复制
Observable<String> mObservable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {

            }
        });

当然除了create方法外,还有just()和from()方法也可以创建Observable对象,在这里我们先不管,先从最简单的学起。

Subscriber的创建

创建比较简单

代码语言:javascript
复制
Subscriber<String> mTestSubscriber = new Subscriber<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {

            }
        };

要注意的是Subsriber是订阅者,它和subscribe不一样,后者是一个订阅关系动作,将Observable与Subscriber绑定起来。

Observer的创建

代码语言:javascript
复制
Observer<String> mTestObsever = new Observer<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {

            }
        };

可以看到Subscriber和Observer很相似。

而实际上Observer是一个接口,而Subscriber是它的一个抽象实现类。源码如下:

代码语言:javascript
复制
public interface Observer<T> {}

public abstract class Subscriber<T> implements Observer<T>, Subscription {}

Obersevable与Subscriber的关联

大家已经知道怎么创建Obeservable与Subscriber了,那么它们怎么联系起来的呢?答案是subsribe方法。

代码语言:javascript
复制
 mObservable.subscribe(mTestSubscriber);

这里有一点迷惑性,一般来说正确的写法似乎是这样

代码语言:javascript
复制
mTestSubscriber.subscribe(mObservable);

但RxJava中Api就是如此设计,应该自有它的道理,只是给初学者造成的迷惑,我们需要注意一下。 但这里我想起当初张孝祥老师的面向对象的视频中说过,人把门打开关闭。代码怎么写?

代码语言:javascript
复制
    person.openDoor();
    person.closeDoor();

还是

代码语言:javascript
复制
    door.open();
    door.close();

张老师说是后者,具体哪个对象拥有改变自身属性的方法,这个方法就应该在哪个对象上。这样的好处应该在并发环境下更明显。 比如一个电话,很多人抢着打。

代码语言:javascript
复制
class Phone{

    public synchronized call(){}

}

当调用Phone.call()的时候,如果有人占用,其他人自然要等待。但如果要设计成person.callPhone()的时候,问题就没有这么好办了。

好了,扯远了。

回到主题,强调一下

联系被观察者与观察者是通过subscribe()方法

Demo实例

接下来验证的时候到了。写了一个Demo,很简单。 点击一个按钮,然后弹出一个Toast.这中间的流程就是应用了本文的内容。 效果如下:

这里写图片描述
这里写图片描述

代码如下: xml文件很简单,就是一个简单的布局里面有一个按钮。

MainActivity.java

代码语言:javascript
复制
package com.frank.rxandroiddemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import rx.Observable;
import rx.Subscriber;

public class MainActivity extends AppCompatActivity {

    Button mBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtn = (Button) findViewById(R.id.btn_test);
        final Observable<String> mObservable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello");
                subscriber.onNext("How are you?");
                subscriber.onNext("Yes,i\'m fine,thank you!");
                subscriber.onCompleted();
            }
        });

        final Subscriber<String> mTestSubscriber = new Subscriber<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
            }
        };



        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mObservable.subscribe(mTestSubscriber);
            }
        });

    }
}

流程如下: 1. 创建Obsersevable对象与Subscriber对象。 2. 按钮点击时通过mObservable.subscribe(mTestSubscriber)方法去触发Obsersevable中的OnSubscribe中的call()方法。 3. 在call方法中会调用subscriber的onNext()方法,而这里的subsriber就是mTestSubscriber。 4. mTestSubscriber在onNext()方法中处理接收到的字符串,然后进行处理,这里是弹出Toast.

需要注意的是,当call()中subscriber处理完所有的事件后,需要发送onCompleted()或者onError()方法来终结此次任务

好了,今天的任何到此为此,没有什么学习量,我们一步一步来,把那些知识要点在未来日子中一个一个地拿下。

希望初学者跟我一起学得轻松。

未完待续。。。。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年09月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Observable,Subscribers
    • Observable的创建
      • Subscriber的创建
        • Observer的创建
          • Obersevable与Subscriber的关联
            • Demo实例
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档