RxJava详解(基于2.X版本的变换操作符)

本章节讲述RxJava基于2.X版本的变换操作符

 

 

1.Map()

 

<1> 作用

被观察者发送的事件转换为任意的类型事件。

 

 

<2> 代码

package com.example.rxjava20;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;

public class MainActivity extends AppCompatActivity {

    private Disposable disposable;

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

        method();
    }

    /**
     * 创建 RxJava的Map变换符
     */

    public void method() {
        Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(ObservableEmitter<Object> e) throws Exception {
                if (e == null) {
                    return;
                }

                //没有切断与观察者的关联 发送Int类型的数据
                if (!e.isDisposed()) {
                    e.onNext(1);
                    e.onNext(2);
                    e.onNext(3);
                    e.onComplete();
                }
            }
        }).map(new Function<Object, Object>() {
            @Override
            public Object apply(Object o) throws Exception {
                if (null == o) {
                    return null;
                }

                int num = (int) o;
                Log.d("TAG", "观察者 map转换前数据 结果num----:" + num);

                return "Map变换符操作 " + num + "  后的内容";
            }
        }).subscribe(new Observer<Object>() {
            @Override
            public void onSubscribe(Disposable d) {
                if (null == d) {
                    return;
                }
                disposable = d;
                Log.d("TAG", "观察者 onSubscribe方法 是否断开连接:" + disposable.isDisposed());
            }

            @Override
            public void onNext(Object value) {
                Log.d("TAG", "观察者 onNext方法 结果:" + value.toString());
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }

    /**
     * onDestroy方法
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != disposable) {
            Log.d("TAG", "onDestroy方法 执行时是否断开----:" + disposable.isDisposed());
            if (!disposable.isDisposed()) {//没有断开
                disposable.dispose();//断开
                Log.d("TAG", "onDestroy方法 断开订阅");
            }
        }
    }

}

 

 

<3> 结果

D/TAG: 观察者 onSubscribe方法 是否断开连接:false


D/TAG: 观察者 map转换前数据 结果num----:1

D/TAG: 观察者 onNext方法 结果:Map变换符操作 1  后的内容


D/TAG: 观察者 map转换前数据 结果num----:2

D/TAG: 观察者 onNext方法 结果:Map变换符操作 2  后的内容


D/TAG: 观察者 map转换前数据 结果num----:3

D/TAG: 观察者 onNext方法 结果:Map变换符操作 3  后的内容

 

<4> 关闭页面

D/TAG: onDestroy方法 执行时是否断开----:true

 

 

 

2.FlatMap()

 

<1> 作用

被观察者发送的事件转换为任意的类型事件。和map类似。只不过它的return方式不同。整体操作成List集合不保证onNext方法中的顺序和发送的一致。

 

 

<2> 代码

package com.example.rxjava20;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.ObservableSource;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;

public class MainActivity extends AppCompatActivity {

    private Disposable disposable;

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

        method();
    }

    /**
     * 创建 RxJava flatMap变换符
     */

    public void method() {
        Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(ObservableEmitter<Object> e) throws Exception {
                if (e == null) {
                    return;
                }

                //没有切断与观察者的关联 发送Int类型的数据
                if (!e.isDisposed()) {
                    e.onNext(1);
                    e.onNext(2);
                    e.onNext(3);
                    e.onComplete();
                }
            }
        }).flatMap(new Function<Object, ObservableSource<?>>() {
            @Override
            public ObservableSource<?> apply(Object o) throws Exception {
                if (o == null) {
                    return null;
                }

                final List<String> list = new ArrayList<>();
                int num = (int) o;
                list.add("flatMap变换符 " + num + " 后的内容");

                Log.d("TAG", "观察者 flatMap转换前数据 结果num----:" + num);

                return Observable.fromIterable(list);
            }
        }).subscribe(new Observer<Object>() {
            @Override
            public void onSubscribe(Disposable d) {
                if (null == d) {
                    return;
                }
                disposable = d;
                Log.d("TAG", "观察者 onSubscribe方法 是否断开连接:" + disposable.isDisposed());
            }

            @Override
            public void onNext(Object value) {
                Log.d("TAG", "观察者 onNext方法 结果:" + value.toString());
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }

    /**
     * onDestroy方法
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != disposable) {
            Log.d("TAG", "onDestroy方法 执行时是否断开----:" + disposable.isDisposed());
            if (!disposable.isDisposed()) {//没有断开
                disposable.dispose();//断开
                Log.d("TAG", "onDestroy方法 断开订阅");
            }
        }
    }

}

 

 

<3> 结果

D/TAG: 观察者 onSubscribe方法 是否断开连接:false


D/TAG: 观察者 flatMap转换前数据 结果num----:1

D/TAG: 观察者 onNext方法 结果:flatMap变换符 1 后的内容


D/TAG: 观察者 flatMap转换前数据 结果num----:2

D/TAG: 观察者 onNext方法 结果:flatMap变换符 2 后的内容


D/TAG: 观察者 flatMap转换前数据 结果num----:3

D/TAG: 观察者 onNext方法 结果:flatMap变换符 3 后的内容

 

 

<4> 关闭页面

D/TAG: onDestroy方法 执行时是否断开----:false

D/TAG: onDestroy方法 断开订阅

 

 

 

3.ConcatMap()

 

<1> 作用

被观察者发送的事件转换为任意的类型事件。和flatMap类似。整体操作成List集合保证onNext方法中的顺序和发送的一致性。

 

 

<2> 代码

package com.example.rxjava20;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.ObservableSource;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;

public class MainActivity extends AppCompatActivity {

    private Disposable disposable;

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

        method();
    }

    /**
     * 创建 RxJava concatMap变换符
     */

    public void method() {
        Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(ObservableEmitter<Object> e) throws Exception {
                if (e == null) {
                    return;
                }

                //没有切断与观察者的关联 发送Int类型的数据
                if (!e.isDisposed()) {
                    e.onNext(4);
                    e.onNext(5);
                    e.onNext(6);
                    e.onComplete();
                }
            }
        }).concatMap(new Function<Object, ObservableSource<?>>() {
            @Override
            public ObservableSource<?> apply(Object o) throws Exception {
                if (o == null) {
                    return null;
                }

                final List<String> list = new ArrayList<>();
                int num = (int) o;
                list.add("concatMap变换符 " + num + " 后的内容");

                Log.d("TAG", "观察者 concatMap转换前数据 结果num----:" + num);

                return Observable.fromIterable(list);
            }
        }).subscribe(new Observer<Object>() {
            @Override
            public void onSubscribe(Disposable d) {
                if (null == d) {
                    return;
                }
                disposable = d;
                Log.d("TAG", "观察者 onSubscribe方法 是否断开连接:" + disposable.isDisposed());
            }

            @Override
            public void onNext(Object value) {
                Log.d("TAG", "观察者 onNext方法 结果:" + value.toString());
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }

    /**
     * onDestroy方法
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != disposable) {
            Log.d("TAG", "onDestroy方法 执行时是否断开----:" + disposable.isDisposed());
            if (!disposable.isDisposed()) {//没有断开
                disposable.dispose();//断开
                Log.d("TAG", "onDestroy方法 断开订阅");
            }
        }
    }

}

 

 

 

<3> 结果

D/TAG: 观察者 onSubscribe方法 是否断开连接:false


D/TAG: 观察者 concatMap转换前数据 结果num----:4

D/TAG: 观察者 onNext方法 结果:concatMap变换符 4 后的内容


D/TAG: 观察者 concatMap转换前数据 结果num----:5

D/TAG: 观察者 onNext方法 结果:concatMap变换符 5 后的内容


D/TAG: 观察者 concatMap转换前数据 结果num----:6

D/TAG: 观察者 onNext方法 结果:concatMap变换符 6 后的内容

 

 

<4> 关闭页面

D/TAG: onDestroy方法 执行时是否断开----:false

D/TAG: onDestroy方法 断开订阅

 

 

 

4.Buffer()

 

<1> 作用

定期被观察者(Obervable)需要发送的事件中 获取一定数量的事件 & 放到缓存区中,最终发送。即缓存被观察者发送的事件。

 

 

<2> 代码

package com.example.rxjava20;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

public class MainActivity extends AppCompatActivity {

    private Disposable disposable;

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

        method();
    }

    /**
     * 创建 RxJava buffer变换符
     */

    public void method() {
        Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(ObservableEmitter<Object> e) throws Exception {
                if (e == null) {
                    return;
                }

                //没有切断与观察者的关联 发送Int类型的数据
                if (!e.isDisposed()) {
                    e.onNext(1);
                    e.onNext(2);
                    e.onNext(3);
                    e.onNext(4);
                    e.onNext(5);
                    e.onNext(6);
                    e.onComplete();
                }
            }
        }).buffer(2, 2)
                .subscribe(new Observer<Object>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        if (null == d) {
                            return;
                        }
                        disposable = d;
                        Log.d("TAG", "观察者 onSubscribe方法 是否断开连接:" + disposable.isDisposed());
                    }

                    @Override
                    public void onNext(Object value) {
                        Log.d("TAG", "观察者 onNext方法 结果:" + value.toString());
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

    /**
     * onDestroy方法
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != disposable) {
            Log.d("TAG", "onDestroy方法 执行时是否断开----:" + disposable.isDisposed());
            if (!disposable.isDisposed()) {//没有断开
                disposable.dispose();//断开
                Log.d("TAG", "onDestroy方法 断开订阅");
            }
        }
    }

}

 

public final Observable<List<T>> buffer(int count, int skip) {}

参数1:count:缓存区大小 = 每次从被观察者中获取的事件数量。

参数2:skip:步长 = 每次获取新事件的数量。

 

 

 

<3> 结果

D/TAG: 观察者 onSubscribe方法 是否断开连接:false


D/TAG: 观察者 onNext方法 结果:[1, 2]


D/TAG: 观察者 onNext方法 结果:[3, 4]


D/TAG: 观察者 onNext方法 结果:[5, 6]

 

 

<4> 关闭页面

D/TAG: onDestroy方法 执行时是否断开----:true

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值