RxJava中BehaviorSubject适合的使用场景

上篇大体介绍了RxJava中几种常见的Subject特性

下面我们着重阐述BehaviorSubject在Android中适合的使用场景及其实现方式

场景:A页面正在请求数据D时立马跳到B页面,B页面希望能够接受到A页面发起请求返回的数据

解决方案有多种eg:使用Android 驻留广播机制、EventBus、RxJava。

该篇主要介绍RxJava的具体实现方式
它和前面几种方案都类似,都是在B页面注册广播事件、在数据D回来后立马发送广播(即使注册或者订阅的是在发送广播/事件之后)


第一步:编写一个类,该类负责发送事件和订阅事件

public class MyDataEvent {

    //能够缓存订阅之前的最新数据(如果有)
    private static BehaviorSubject sTotalAssetEvent = BehaviorSubject.create();

    private MyDataEvent() {
    }
    /**
     * 发送事件
     * @param text
     */
    public static void publish(String text) {
        sTotalAssetEvent.onNext(text);
    }


    /**
     * 订阅事件
     * @param action
     * @return
     */
    public static Subscription subscrible(Action1 action) {
        return sTotalAssetEvent.subscribe(action);
    }


    /**
     * 反订阅 防止内存泄露
     * @param subscription
     */
    public static void unSubscrble(Subscription subscription) {
        if (subscription != null && !subscription.isUnsubscribed()) {
            subscription.unsubscribe();
            subscription = null;
        }
    }
}

第二步:在A页面请求数据回来后发送数据事件通知

 MyDataEvent.publish("this is a data"+(data++));

第三步:在B页面中订阅事件并对数据做业务逻辑处理

public class BActivity extends Activity {

    private Subscription mSubscription;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);

        mSubscription = MyDataEvent.subscrible(new Action1() {
            @Override
            public void call(String data) {
                //receive event and process data
                Log.d("dbs", BActivity.class.getSimpleName() + ": " + data);
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        MyDataEvent.unSubscrble(mSubscription);
    }
}

这样无论是数据在进入页面B前到达还是数据在进入页面B之后到达,B页面都会接受到数据,因为此处使用了BehaviorSubject。

效果图
RxJava中BehaviorSubject适合的使用场景_第1张图片

附件下载

如果对BehaviorSubject不是很了解可以参看RxJava中常见的几种Subject

你可能感兴趣的:(android开发,RxJava)