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

        @Override public void onCompleted() {

        }

        @Override public void onError(Throwable e) {

        }

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

    // 订阅者, 接收字符串, 提示信息
    //而被通知的对象称为观察者
    private Subscriber mToastSubscriber = new Subscriber() {
        // 完成事件接受执行
        @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的使用方法.
 * 

* 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 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 obShow = Observable.just(sayMyName()); //观察目标和观察者绑定/订阅 //映射, 对输入数据进行转换, 如大写.map属于可选参数 obShow.observeOn(AndroidSchedulers.mainThread()) .map(mUpperLetterFunc).subscribe(mTextViewAction); //--------------------- // 单独显示数组中的每个元素 //获取输入数组, 转变单个元素分发. Observable 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 mTextViewAction = new Action1() { @Override public void call(String s) { mTvText.setText(s); } }; // Action设置Toast private Action1 mToastAction = new Action1() { @Override public void call(String s) { Toast.makeText(MoreActivity.this, s, Toast.LENGTH_SHORT).show(); } }; // 设置映射函数 private Func1, Observable> mOneLetterFunc = new Func1, Observable>() { @Override public Observable call(List strings) { return Observable.from(strings); // 映射字符串 } }; // 设置大写字母 private Func1 mUpperLetterFunc = new Func1() { @Override public String call(String s) { return s.toUpperCase(); // 大小字母 } }; // 连接字符串 private Func2 mMergeStringFunc = new Func2() { @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网络请求库配合的使用才会更加强大,后续接着写了

你可能感兴趣的:(android)