package com.camnter.newlife.ui.activity.rx; import android.os.Bundle; import android.widget.TextView; import com.camnter.newlife.R; import com.camnter.newlife.bean.RxChildData; import com.camnter.newlife.bean.RxData; import com.camnter.newlife.core.activity.BaseAppCompatActivity; import rx.Observable; import rx.Subscriber; import rx.Subscription; import rx.functions.Func1; /** * Description:RxMapActivity * Created by:CaMnter * Time:2015-12-01 17:28 */ public class RxMapActivity extends BaseAppCompatActivity { public static final int KEY = 206; public static final String VALUE = "Save you from anything"; private TextView rxMapOneTV; private TextView rxMapTwoTV; private TextView rxFlatMapThrTV; private TextView rxLiftFouTV; private Subscription rxOneSubscription; private Subscription rxTwoSubscription; private Subscription rxThrSubscription; private Subscription rxFouSubscription; /** * Fill in layout id * * @return layout id */ @Override protected int getLayoutId() { return R.layout.activity_rx_map; } /** * Initialize the view in the layout * * @param savedInstanceState savedInstanceState */ @Override protected void initViews(Bundle savedInstanceState) { this.rxMapOneTV = (TextView) this.findViewById(R.id.rx_map_one_tv); this.rxMapTwoTV = (TextView) this.findViewById(R.id.rx_map_two_tv); this.rxFlatMapThrTV = (TextView) this.findViewById(R.id.rx_map_thr_tv); this.rxLiftFouTV = (TextView) this.findViewById(R.id.rx_map_fou_tv); } /** * Initialize the View of the listener */ @Override protected void initListeners() { } @Override protected void initData() { /** * map一对一的类型转换 * 通过map改变订阅者接受的参数 * 传入的是Integer,改后变为String * 订阅者接收到的也是String */ this.rxOneSubscription = Observable.just(KEY).map(integer -> { switch (integer) { case KEY: return VALUE; default: return VALUE; } }).subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { RxMapActivity.this.rxMapOneTV.setText(s); } }); RxData data1 = new RxData(); data1.setId(106L); RxData data2 = new RxData(); data2.setId(206L); RxData data3 = new RxData(); data3.setId(266L); RxData[] data = { data1, data2, data3 }; /** * map一对一的类型转换 * 通过map改变订阅者接受的参数 * 传入的是RxData,改后变为Long * 订阅者接收到的也是Long */ this.rxTwoSubscription = Observable.from(data) .map(rxData -> rxData.getId()) .subscribe(new Subscriber<Long>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Long aLong) { String text = RxMapActivity.this.rxMapTwoTV.getText().toString(); text += aLong + " "; RxMapActivity.this.rxMapTwoTV.setText(text); } }); RxData parentData = new RxData(); RxChildData childData1 = new RxChildData(); childData1.setChildContent("childData1"); RxChildData childData2 = new RxChildData(); childData2.setChildContent("childData2"); RxChildData childData3 = new RxChildData(); childData3.setChildContent("childData3"); RxChildData[] childData = { childData1, childData2, childData3 }; parentData.setChildData(childData); /** * flatMap一对多的类型转换 * flatMap() 和 map() 有一个相同点:它也是把传入的参数转化之后返回另一个对象。 * 和 map() 不同的是, flatMap() 中返回的是个 Observable 对象, * 并且这个 Observable 对象并不是被直接发送到了 Subscriber 的回调方法中。 * flatMap() 的原理是这样的: * 1. 使用传入的事件对象创建一个 Observable 对象; * 2. 并不发送这个 Observable, 而是将它激活,于是它开始发送事件; * 3. 每一个创建出来的 Observable 发送的事件,都被汇入同一个 Observable,而 * 这个 Observable 负责将这些事件统一交给 Subscriber 的回调方法。这三个步骤,把 * 事件拆成了两级,通过一组新创建的 Observable 将初始的对象『铺平』之后通过统一路径 * 分发了下去。而这个『铺平』就是 flatMap() 所谓的 flat */ this.rxThrSubscription = Observable.from(new RxData[] { parentData }) .flatMap(new Func1<RxData, Observable<RxChildData>>() { @Override public Observable<RxChildData> call(RxData rxData) { return Observable.from(rxData.getChildData()); } }) .subscribe(new Subscriber<RxChildData>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(RxChildData rxChildData) { String text = RxMapActivity.this.rxFlatMapThrTV.getText() .toString(); text += rxChildData.getChildContent() + " "; RxMapActivity.this.rxFlatMapThrTV.setText(text); } }); /** * 当含有 lift() 时: * 1.lift() 创建了一个 Observable 后,加上之前的原始 Observable,已经有两个 Observable 了; * 2.而同样地,新 Observable 里的新 OnSubscribe 加上之前的原始 Observable 中的原始 OnSubscribe,也 * 就有了两个 OnSubscribe; * 3.当用户调用经过 lift() 后的 Observable 的 subscribe() 的时候,使用的是 lift() 所返回的新 * 的 Observable ,于是它所触发的 onSubscribe.call(subscriber),也是用的新 Observable 中的 * 新 OnSubscribe,即在 lift() 中生成的那个 OnSubscribe; * 4.而这个新 OnSubscribe 的 call() 方法中的 onSubscribe ,就是指的原始 Observable 中的原始 * OnSubscribe ,在这个 call() 方法里,新 OnSubscribe 利用 operator.call(subscriber) 生成 * 了一个新的 Subscriber(Operator 就是在这里,通过自己的 call() 方法将新 Subscriber 和原始 * Subscriber 进行关联,并插入自己的『变换』代码以实现变换),然后利用这个新 Subscriber 向原始 * Observable 进行订阅。 * 这样就实现了 lift() 过程,有点像一种代理机制,通过事件拦截和处理实现事件序列的变换。 */ this.rxFouSubscription = Observable.from(new Integer[] { 6, 7 }) .lift((Observable.Operator<String, Integer>) subscriber -> new Subscriber<Integer>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Integer integer) { subscriber.onNext(integer + ""); } }) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { String text = RxMapActivity.this.rxLiftFouTV.getText() .toString(); text += s + " "; RxMapActivity.this.rxLiftFouTV.setText(text); } }); } @Override protected void onDestroy() { this.rxOneSubscription.unsubscribe(); this.rxTwoSubscription.unsubscribe(); this.rxThrSubscription.unsubscribe(); this.rxFouSubscription.unsubscribe(); super.onDestroy(); } }