RxAndroid的使用方式(一)

RxAndroid一个功能强大的框架,强大意味掌握成本比较高,断断续续研究了很久,今天写出来,输出才是更好的输入.

Rx是什么

Rx并不是一种新的语言,而是一种普通的Java模式,类似于观察者模式(Observer Pattern),可以将它看作一个普通的Java类库,因此你可以立即使用RxJava。而RxAndroid是RxJava的一个针对Android平台的扩展,主要用于 Android 开发。

Rx核心就是观察者模式.
观察者模式,建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
作为对这个通知的响应,每个观察者都将即时更新自己的状态,以与目标状态同步,这种交互也称为发布-订阅(publishsubscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅它并接收通

RxAndroid基础使用

代码中创建两个订阅者, 使用字符串输出信息.
在页面中, 观察者接收信息, 发送至主线程AndroidSchedulers.mainThread(), 再传递给订阅者, 由订阅者最终处理消息. 接收信息可以是同步, 也可以是异步.

package clwang.chunyu.me.testdetailrxandroid;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.Bind;
import butterknife.ButterKnife;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
/**
 * RxJava的基础讲解, 包含一个观察者(Observable), 两个订阅者(Subscriber).
 */
public class SimpleActivity extends Activity {
    @Bind(R.id.simple_tv_text) TextView mTvText;
    //观察目标
    // 观察事件发生,发生改变的对象称为观察目标
    private Observable.OnSubscribe mObservableAction = new Observable.OnSubscribe<String>() {
        @Override public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext(sayMyName()); // 发送事件
           subscriber.onCompleted(); // 完成事件
        }
    };

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple);
        ButterKnife.bind(this);

        // 注册观察活动
        Observable<String> observable = Observable.create(mObservableAction);
        // 分发订阅信息
        // Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
        observable.observeOn(AndroidSchedulers.mainThread());
        //观察目标和观察者绑定/订阅
        observable.subscribe(mToastSubscriber);
         //观察目标和观察者绑定/订阅
        observable.subscribe(mTextSubscriber);
    }
    // 订阅者, 接收字符串, 修改控件
    //而被通知的对象称为观察者
    private Subscriber<String> mTextSubscriber = new Subscriber<String>() {

        @Override public void onCompleted() {

        }

        @Override public void onError(Throwable e) {

        }

        @Override public void onNext(String s) {
            mTvText.setText(s); // 设置文字
        }
    };

    // 订阅者, 接收字符串, 提示信息
    //而被通知的对象称为观察者
    private Subscriber<String> mToastSubscriber = new Subscriber<String>() {
        // 完成事件接受执行
        @Override public void onCompleted() {
            Toast.makeText(SimpleActivity.this, "onCompleted",Toast.LENGTH_SHORT).show();
        }

        @Override public void onError(Throwable e) {

        }

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

    // 创建字符串
    private String sayMyName() {
        return "Hello, I am your friend, Spike11!";
    }
}

RxAndroid扩展使用

代码中的新方法,核心为了简化调用代码, Rx的写法可以是多种多样, 合理的写法会更加优雅.

package clwang.chunyu.me.testdetailrxandroid;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Arrays;
import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.functions.Func2;

/**
 * 更多的RxAndroid的使用方法.
 * <p>
 * Created by wangchenlong on 15/12/30.
 */
public class MoreActivity extends Activity {

    @Bind(R.id.simple_tv_text)
    TextView mTvText;

    final String[] mManyWords = {"Hello", "I", "am", "your", "friend", "Spike"};
    final List<String> mManyWordList = Arrays.asList(mManyWords);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple);
        ButterKnife.bind(this);

        // 添加字符串, 省略Action的其他方法, 只使用一个onNext.
        //创建观察目标/just: 获取输入数据, 直接分发, 更加简洁, 省略其他回调.
        Observable<String> obShow = Observable.just(sayMyName());

        //观察目标和观察者绑定/订阅
        //映射, 对输入数据进行转换, 如大写.map属于可选参数
        obShow.observeOn(AndroidSchedulers.mainThread())
                .map(mUpperLetterFunc).subscribe(mTextViewAction);
//---------------------

        // 单独显示数组中的每个元素
        //获取输入数组, 转变单个元素分发.
        Observable<String> obMap = Observable.from(mManyWords);
        // 映射之后分发
        obMap.observeOn(AndroidSchedulers.mainThread())
                .map(mUpperLetterFunc).subscribe(mToastAction);
//---------------------
        // 优化过的代码, 直接获取数组, 再分发, 再合并, 再显示toast, Toast顺次执行.
      //flatMap: 增大, 本意就是增肥, 把输入数组映射多个值, 依次分发.
       //reduce: 简化, 正好相反, 把多个数组的值, 组合成一个数据.
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                Observable.just(mManyWordList)
                        // Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
                        .observeOn(AndroidSchedulers.mainThread())
                        .flatMap(mOneLetterFunc)
                        .reduce(mMergeStringFunc)
                        .subscribe(mToastAction);

//                try {
//                    Thread.sleep(1000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }

            }
        });
        //开启线程
        thread.start();
    }

    // Action类似订阅者, 设置TextView
    private Action1<String> mTextViewAction = new Action1<String>() {
        @Override
        public void call(String s) {
            mTvText.setText(s);
        }
    };

    // Action设置Toast
    private Action1<String> mToastAction = new Action1<String>() {
        @Override
        public void call(String s) {
            Toast.makeText(MoreActivity.this, s, Toast.LENGTH_SHORT).show();
        }
    };

    // 设置映射函数
    private Func1<List<String>, Observable<String>> mOneLetterFunc = new Func1<List<String>, Observable<String>>() {
        @Override
        public Observable<String> call(List<String> strings) {
            return Observable.from(strings); // 映射字符串
        }
    };

    // 设置大写字母
    private Func1<String, String> mUpperLetterFunc = new Func1<String, String>() {
        @Override
        public String call(String s) {
            return s.toUpperCase(); // 大小字母
        }
    };

    // 连接字符串
    private Func2<String, String, String> mMergeStringFunc = new Func2<String, String, String>() {
        @Override
        public String call(String s, String s2) {
            return String.format("%s %s", s, s2); // 空格连接字符串
        }
    };


    // 创建字符串
    private String sayMyName() {
        return "Hello, I am your friend, Spike!";
    }
}

RxAndroid代码的基本使用,后续和Retrofit网络请求库配合的使用才会更加强大,后续接着写了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值