Rxjava使用

本文详细介绍了RxJava在实际开发中的应用,包括如何引入依赖、基本操作符的使用、订阅过程及错误处理等关键知识点,帮助开发者深入理解并掌握RxJava在Android开发中的实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依赖 

/*RxAndroid所依赖的库*/
    implementation 'io.reactivex:rxandroid:1.2.1'
    implementation 'io.reactivex:rxjava:1.1.6'
package com.sn.rxandroid;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

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

import rx.Observable;
import rx.Subscriber;
import rx.functions.Action1;
import rx.functions.Func1;

public class MainActivity extends AppCompatActivity{


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //RxAndroid的基本使用
//        RxAndroidBase();
        //RxAndroid接收一个集合对象,对其中数据一个一个观察
//        RxAndroidFrmo();
        //RxAndroid接收一个集合对象,对整个集合进行操作
//        RxAndroidJust();
        //RxAndroid接收一个集合对象,对其中数据进行过滤
//        RxAndroidFilterStream();
        //RxAndroid接收一个集合对象,对其中数据进行转换
//        RxAndroidMapStream();
        //把拿到的集合,进行拆分观察
//        RxAndroidFlatMap();
    }

    private void RxAndroidBase() {
        //创建被观察者,注意:这里不要用成java包下的,而是要用rx包下的类
        //参数是一个对象,泛型代表了要发送(观察)的数据类型
        Observable<String> stringObservable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override//这里的subscriber ,就是你在下面注册的subscriber对象
            public void call(Subscriber<? super String> subscriber) {
                //开始发送的事件,执行的逻辑相当于上一个例子Account中的setMoney方法
                subscriber.onNext(""");
                //当被观察者,观察结束时,回调的方法
//                subscriber.onCompleted();
                subscriber.onNext("yichenfeng");
                subscriber.onNext("");
                //当被观察者有异常时,调用的方法
                subscriber.onError(new Throwable());
                subscriber.onNext("");
            }
        });

        //创建观察者
        Subscriber<String> subscriber = new Subscriber<String>() {
            //该方法在所有事件开始时回调,可用可不用
            @Override
            public void onStart() {
                super.onStart();
            }

            //该方法在被观察者发送变化时回调
            @Override
            public void onNext(String s) {
                System.out.println("onNext : " + s + "脸皮乃天下第一防御型神器");
            }

            //该方法有异常回调
            //注意:一旦这个方法执行了,就代表观察出现问题,其他两个回调方法,及时在下面还有调用,也不会执行了
            @Override
            public void onError(Throwable e) {
                System.out.println("onError : " + e);
            }

            //当所有事件观察完毕的,回调,事件序列结束标记
            //注意:一旦这个方法执行了,就代表观察结束,其他两个回调方法,及时在下面还有调用,也不会执行了
            @Override
            public void onCompleted() {
                System.out.println("onCompleted : ");
            }
        };
        //把观察者注册到被观察身上,只要一有这段代码,Observable.create下的call方法就会执行
        stringObservable.subscribe(subscriber);

    }

    private void RxAndroidFrmo() {
        //创建一个集合,并装上数据
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
        //创建被观察者,注意:这里不要用成java包下的,而是要用rx包下的类
        //参数是一个集合,使用这种方式,会根据集合的数量调用对应次数的subscriber.onNext方法,把集合中的数据一个一个输出
        Observable.from(integers)
                //被观察者一创建就指定了观察者,如此就不用在后面进行注册绑定了
                //如果用不到onError,onCompleted方法,就创建Action1 ,其中的 call == onNext
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println("onNext : " + integer);
                    }
                });
    }
    //RxAndroid接收一个集合对象,对整个集合进行操作
    private void RxAndroidJust() {
        //创建一个集合,并装上数据
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
        //创建被观察者,注意:这里不要用成java包下的,而是要用rx包下的类
        //参数是一个集合,使用这种方式,会把这个集合整个输出一次
        Observable.just(integers)
                //如果用不到onError,onCompleted方法,就创建Action1 ,其中的call == onNext
                .subscribe(new Action1<List<Integer>>() {
                    @Override
                    public void call(List<Integer> integers) {
                        System.out.println(integers);
                    }
                });
    }

    private void RxAndroidFilterStream() {
        //创建一个集合,并装上数据
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
        //创建被观察者,注意:这里不要用成java包下的,而是要用rx包下的类
        //参数是一个集合,使用这种方式,会根据集合的数量调用对应次数的subscriber.onNext方法,把集合中的数据一个一个输出
        Observable.from(integers)
                //对集合数据进行过滤,只发送符合条件的事件
                .filter(new Func1<Integer, Boolean>() {
                    @Override
                    public Boolean call(Integer integer) {
                        return integer < 4;
                    }
                })
                //如果用不到onError,onCompleted方法,就创建Action1 ,其中的call == onNext
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println("onNext : " + integer);
                    }
                });
    }


    private void RxAndroidMapStream() {
        //创建一个集合,并装上数据
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
        //创建被观察者,注意:这里不要用成java包下的,而是要用rx包下的类
        //参数是一个集合,使用这种方式,会根据集合的数量调用对应次数的subscriber.onNext方法,把集合中的数据一个一个输出
        Observable.from(integers)
                //对集合数据进行转换,参数 1.代表了原数据类型(转换前)  2.代表了要转换最终结果的数据类型(转换后)
                //提示:可以把流转换成bitmap,文件,String...    把String字符串或数据库Cursor转换为Bean类等
                .map(new Func1<Integer, String>() {
                    @Override
                    public String call(Integer integer) {
                        return integer.toString();
                    }
                })
                //如果用不到onError,onCompleted方法,就创建Action1 ,其中的call == onNext
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        System.out.println(s);
                    }
                });
    }

    //把拿到的集合,进行拆分观察
    private void RxAndroidFlatMap() {
        //创建一个集合,并装上数据
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> integers1 = Arrays.asList(6, 7, 8);
        List<Integer> integers2 = Arrays.asList(9, 10);
        //创建被观察者,注意:这里不要用成java包下的,而是要用rx包下的类
        //参数是一个集合,使用这种方式,会把这个集合整个输出一次
        Observable.just(integers, integers1, integers2)//这里会输出3次,但经过修改要他发送10次
                //这样使用,以后可以减少双层for循环
                .flatMap(new Func1<List<Integer>, Observable<?>>() {
                    //将一个数据再转变为一个观察者
                    @Override
                    public Observable<?> call(List<Integer> integers) {
                        return Observable.from(integers);
                    }
                })
/*                //如果用不到onError,onCompleted方法,就创建Action1 ,其中的call == onNext
                .subscribe(new Action1<List<Integer>>() {
                    @Override
                    public void call(List<Integer> integers) {
                        System.out.println(integers);
                    }
                });*/
                .subscribe(new Action1<Object>() {
                    @Override
                    public void call(Object o) {
                        System.out.println(o);
                    }
                });
    }

    @Override
    protected void onStop() {
        super.onStop();
        //当观察者对象不为空,且处于正在观察的状态中,可以解除观察
//        if(subscriber != null && !subscriber.isUnsubscribed())
//            subscriber.unsubscribe();
    }

    public void scheduler(View view){
        Intent intent = new Intent(MainActivity.this, SchedulerActivity.class);
        startActivity(intent);
        finish();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值