RxJava从入门到精通

1.简介

RxJava是一套异步编程的API,是基于观察者模式的,而且是链式调用

RxJava三个基本要素:

(1) 被观察者(Observable)

(2) 观察者(Observer)

(3) 订阅(subcribe)


首先在gradle文件中添加依赖:

implementation 'io.reactivex.rxjava2:rxjava:2.1.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
        //1.创建被观察者
        Observable observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                Log.i("zhoujian", "currentThread name=" + Thread.currentThread().getName());
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onComplete();
            }
        });

        //2.创建观察者
        Observer observer = new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                Log.i("zhoujian", "onNext=" + integer);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        };

        //3.订阅:被观察者订阅观察者
        observable.subscribe(observer);

打印结果:

06-15 11:24:19.331 11911-11911/com.zhoujian.rxjavademo I/zhoujian: onSubscribe
06-15 11:24:19.332 11911-11911/com.zhoujian.rxjavademo I/zhoujian: currentThread name=main
06-15 11:24:19.332 11911-11911/com.zhoujian.rxjavademo I/zhoujian: onNext=1
06-15 11:24:19.332 11911-11911/com.zhoujian.rxjavademo I/zhoujian: onNext=2
06-15 11:24:19.332 11911-11911/com.zhoujian.rxjavademo I/zhoujian: onNext=3
06-15 11:24:19.332 11911-11911/com.zhoujian.rxjavademo I/zhoujian: onComplete

链式调用

        //使用链式调用
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                Log.i("zhoujian", "currentThread name=" + Thread.currentThread().getName());
                e.onNext(4);
                e.onNext(5);
                e.onNext(6);
                e.onComplete();

            }
        }).subscribe(new Observer<Integer>() {

            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                Log.i("zhoujian", "onNext=" + integer);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        });
        


打印结果:

06-15 11:29:34.376 12082-12082/? I/zhoujian: onSubscribe
06-15 11:29:34.376 12082-12082/? I/zhoujian: currentThread name=main
06-15 11:29:34.376 12082-12082/? I/zhoujian: onNext=4
06-15 11:29:34.377 12082-12082/? I/zhoujian: onNext=5
06-15 11:29:34.377 12082-12082/? I/zhoujian: onNext=6
06-15 11:29:34.377 12082-12082/? I/zhoujian: onComplete


被观察者发送的事件有以下几种

事件种类作用
onNext()发送该事件时,观察者会回调 onNext() 方法

onError()

发送该事件时,观察者会回调 onError() 方法,当发送该事件之后,其他事件将不会继续发送
onComplete()发送该事件时,观察者会回调 onComplete() 方法,当发送该事件之后,其他事件将不会继续发送

2.各种操作符

(1) create() :创建一个被观察者

 
        Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                emitter.onNext("你好!观察者");
                emitter.onComplete();
            }
        });

(2) just() : 创建一个被观察者,并发送事件,发送事件不能超过10个


Observable.just(1,2,3).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                Log.i("zhoujian", "onNext="+integer);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        });

打印结果:

06-15 13:30:04.761 14162-14162/? I/zhoujian: onSubscribe
06-15 13:30:04.761 14162-14162/? I/zhoujian: onNext=1
06-15 13:30:04.761 14162-14162/? I/zhoujian: onNext=2
06-15 13:30:04.761 14162-14162/? I/zhoujian: onNext=3
06-15 13:30:04.761 14162-14162/? I/zhoujian: onComplete

(3) fromArray()

和just()方法类似,用于创建一个被观察者,fromArray可以传入多余10个的变量,并且可以传入一个

Integer[] array = {4, 5, 6};
        Observable.fromArray(array).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                Log.i("zhoujian", "onNext="+integer);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        });


打印结果:

06-15 14:16:12.734 16231-16231/com.zhoujian.rxjavademo I/zhoujian: onSubscribe
06-15 14:16:12.735 16231-16231/com.zhoujian.rxjavademo I/zhoujian: onNext=4
06-15 14:16:12.735 16231-16231/com.zhoujian.rxjavademo I/zhoujian: onNext=5
06-15 14:16:12.735 16231-16231/com.zhoujian.rxjavademo I/zhoujian: onNext=6
06-15 14:16:12.735 16231-16231/com.zhoujian.rxjavademo I/zhoujian: onComplete


(4) fromCallable()

Callable和Runnable用法基本一致,只是它返回一个结果值,这个结果值就是发送给观察者的

 Observable.fromCallable(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                return 6;
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.i("zhoujian", "accept="+integer);
            }
        });

返回结果:

06-15 14:37:13.855 18327-18327/? I/zhoujian: accept=6


(5) fromFuture()

Future的作用增加了cancel()等方法操作Callable,它可以通过get()方法来获取Callable返回的值

        final FutureTask<String> futureTask = new FutureTask<String>(new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "Sucessed";
            }
        });

        Observable.fromFuture(futureTask).doOnSubscribe(new Consumer<Disposable>() {
            @Override
            public void accept(Disposable disposable) throws Exception {
                futureTask.run();
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.i("zhoujian", "accept="+s);
            }
        });

        
        


返回结果:

06-15 14:57:28.904 19576-19576/com.zhoujian.rxjavademo I/zhoujian: accept=Sucessed


(6) fromIterrable

直接发送一个List集合给观察者

 List<String> list = new ArrayList<>();
        list.add("7");
        list.add("8");
        list.add("9");
        list.add("10");
        Observable.fromIterable(list).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(String s) {
                Log.i("zhoujian", "onNext="+s);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        });





打印结果:

06-15 15:09:01.927 20242-20242/? I/zhoujian: onSubscribe
06-15 15:09:01.927 20242-20242/? I/zhoujian: onNext=7
06-15 15:09:01.927 20242-20242/? I/zhoujian: onNext=8
06-15 15:09:01.927 20242-20242/? I/zhoujian: onNext=9
06-15 15:09:01.927 20242-20242/? I/zhoujian: onNext=10
06-15 15:09:01.927 20242-20242/? I/zhoujian: onComplete


(7) defer()

这个方法作用是直到被观察者被订阅后才会创建被观察者

private Integer integer = 1;
        Observable<Integer> observable = Observable.defer(new Callable<ObservableSource<? extends Integer>>() {
            @Override
            public ObservableSource<? extends Integer> call() throws Exception {
                return Observable.just(integer);
            }
        });
        integer = 2;
        Observer observer = new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                Log.i("zhoujian", "onNext="+integer);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        };
        //被观察者订阅观察者
        observable.subscribe(observer);
        integer = 3;
        observable.subscribe(observer);
        
        


打印结果:

06-15 15:35:50.567 21116-21116/com.zhoujian.rxjavademo I/zhoujian: onSubscribe
06-15 15:35:50.568 21116-21116/com.zhoujian.rxjavademo I/zhoujian: onNext=2
06-15 15:35:50.568 21116-21116/com.zhoujian.rxjavademo I/zhoujian: onComplete
06-15 15:35:50.568 21116-21116/com.zhoujian.rxjavademo I/zhoujian: onSubscribe
06-15 15:35:50.568 21116-21116/com.zhoujian.rxjavademo I/zhoujian: onNext=3
06-15 15:35:50.568 21116-21116/com.zhoujian.rxjavademo I/zhoujian: onComplete


(8) timer()

当到指定时间后,发一个Long型的值0L 给观察者

10秒之后,发一个Long型的0L 给观察者

 Observable.timer(10, TimeUnit.SECONDS).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(Long aLong) {
                Log.i("zhoujian", "onNext="+aLong);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        });

打印结果:

06-20 08:55:24.449 1505-1505/com.zhoujian.rxjavademo I/zhoujian: onSubscribe
06-20 08:55:34.451 1505-1573/com.zhoujian.rxjavademo I/zhoujian: onNext=0
06-20 08:55:34.452 1505-1573/com.zhoujian.rxjavademo I/zhoujian: onComplete

(9) interval()

每隔一段时间会发送一个事件,这个事件从0开始,不断增加1

每隔5秒发送一个事件

  Observable.interval(5,TimeUnit.SECONDS).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(Long aLong) {
                Log.i("zhoujian", "onNext="+aLong);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        });


打印结果:

06-20 09:10:57.196 3826-3826/? I/zhoujian: onSubscribe
06-20 09:11:02.199 3826-3887/com.zhoujian.rxjavademo I/zhoujian: onNext=0
06-20 09:11:07.198 3826-3887/com.zhoujian.rxjavademo I/zhoujian: onNext=1
06-20 09:11:12.198 3826-3887/com.zhoujian.rxjavademo I/zhoujian: onNext=2
06-20 09:11:17.198 3826-3887/com.zhoujian.rxjavademo I/zhoujian: onNext=3
06-20 09:11:22.198 3826-3887/com.zhoujian.rxjavademo I/zhoujian: onNext=4
06-20 09:11:27.198 3826-3887/com.zhoujian.rxjavademo I/zhoujian: onNext=5
06-20 09:11:32.198 3826-3887/com.zhoujian.rxjavademo I/zhoujian: onNext=6



(10) intervalRange()

可以指定发送事件的开始值和数量,其他功能与interval()功能一样


 //从3开始,发送4次事件,间隔2秒,延时1秒
        Observable.intervalRange(3,4,1,2,TimeUnit.SECONDS).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(Long aLong) {
                Log.i("zhoujian", "onNext="+aLong);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        });
        
        

打印结果:

06-25 13:31:15.130 9797-9797/com.zhoujian.rxjavademo I/zhoujian: onSubscribe
06-25 13:31:16.131 9797-10125/com.zhoujian.rxjavademo I/zhoujian: onNext=3
06-25 13:31:18.131 9797-10125/com.zhoujian.rxjavademo I/zhoujian: onNext=4
06-25 13:31:20.131 9797-10125/com.zhoujian.rxjavademo I/zhoujian: onNext=5
06-25 13:31:22.131 9797-10125/com.zhoujian.rxjavademo I/zhoujian: onNext=6
06-25 13:31:22.131 9797-10125/com.zhoujian.rxjavademo I/zhoujian: onComplete

(11) range()

同时发送一定范围的事件序列

 //从3开始,发送5个事件
        Observable.range(3,5).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(Integer integer) {
                Log.i("zhoujian", "onNext="+integer);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        });

打印结果:

06-25 13:43:13.234 11673-11673/com.zhoujian.rxjavademo I/zhoujian: onSubscribe
06-25 13:43:13.234 11673-11673/com.zhoujian.rxjavademo I/zhoujian: onNext=3
06-25 13:43:13.234 11673-11673/com.zhoujian.rxjavademo I/zhoujian: onNext=4
06-25 13:43:13.234 11673-11673/com.zhoujian.rxjavademo I/zhoujian: onNext=5
06-25 13:43:13.234 11673-11673/com.zhoujian.rxjavademo I/zhoujian: onNext=6
06-25 13:43:13.234 11673-11673/com.zhoujian.rxjavademo I/zhoujian: onNext=7
06-25 13:43:13.234 11673-11673/com.zhoujian.rxjavademo I/zhoujian: onComplete

(12) map()

map 可以将被观察者发送的数据类型转变成其他类型


        //将Integer类型的数据转成String类型
        Observable.just(1, 2, 3).map(new Function<Integer, String>() {
            @Override
            public String apply(Integer integer) throws Exception {
                return "我是字符串:"+integer;
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(String s) {
                Log.i("zhoujian", "onNext="+s);
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        });



打印结果:

06-25 13:58:45.536 12272-12272/? I/zhoujian: onSubscribe
06-25 13:58:45.536 12272-12272/? I/zhoujian: onNext=我是字符串:1
06-25 13:58:45.536 12272-12272/? I/zhoujian: onNext=我是字符串:2
06-25 13:58:45.536 12272-12272/? I/zhoujian: onNext=我是字符串:3
06-25 13:58:45.536 12272-12272/? I/zhoujian: onComplete


(13) flatMap()

与map() 类似  flatMap() 返回一个新的被观察者

将多个电影转换成多个演员输出

先准备数据

Actor.java

package com.zhoujian.rxjavademo;

/**
 * Created by zhoujian on 2018/6/25.
 */

public class Actor {

    private String name;
    private String  sex;

    public Actor(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Actor{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}


Movie.java

package com.zhoujian.rxjavademo;

import java.util.List;

/**
 * Created by zhoujian on 2018/6/25.
 */

public class Movie
{

    private String name;
    private int id;
    private String data;
    private List<Actor> mactorList;

    public Movie(String data, int id, List<Actor> mactorList, String name)
    {
        this.data = data;
        this.id = id;
        this.mactorList = mactorList;
        this.name = name;
    }


    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<Actor> getMactorList() {
        return mactorList;
    }

    public void setMactorList(List<Actor> mactorList) {
        this.mactorList = mactorList;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @Override
    public String toString() {
        return "Movie{" +  "data='" + data + '\'' + ", name='" + name + '\'' +", id=" + id + ", mactorList=" + mactorList + '}';
    }
}

 private void getDatas() {
        Actor actor1 = new Actor("周星驰", "男");
        Actor actor2 = new Actor("张柏芝", "女");
        ArrayList<Actor> movie1List = new ArrayList<Actor>();
        movie1List.add(actor1);
        movie1List.add(actor2);
        Movie movie1 = new Movie("1998-10-14", 1, movie1List, "喜剧之王");
        moveList.add(movie1);
        Actor actor3 = new Actor("罗志祥", "男");
        Actor actor4 = new Actor("张雨绮", "女");
        ArrayList<Actor> movie2List = new ArrayList<Actor>();
        movie2List.add(actor3);
        movie2List.add(actor4);
        Movie movie2 = new Movie("2016-05-01", 2, movie2List, "美人鱼");
        moveList.add(movie2);
    }


 //将多个电影转换成多个演员输出
        Observable.fromIterable(moveList).flatMap(new Function<Movie, ObservableSource<Actor>>() {
            @Override
            public ObservableSource<Actor> apply(Movie movie) throws Exception {
                return Observable.fromIterable(movie.getMactorList());
            }
        }).subscribe(new Observer<Actor>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(Actor actor) {
                Log.i("zhoujian", "onNext="+actor.toString());
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        });




打印结果:

06-25 15:22:38.233 15514-15514/? I/zhoujian: onSubscribe
06-25 15:22:38.233 15514-15514/? I/zhoujian: onNext=Actor{name='周星驰', sex='男'}
06-25 15:22:38.233 15514-15514/? I/zhoujian: onNext=Actor{name='张柏芝', sex='女'}
06-25 15:22:38.233 15514-15514/? I/zhoujian: onNext=Actor{name='罗志祥', sex='男'}
06-25 15:22:38.233 15514-15514/? I/zhoujian: onNext=Actor{name='张雨绮', sex='女'}
06-25 15:22:38.234 15514-15514/? I/zhoujian: onComplete


(14) concatMap()

concatMap()和flatMap() 基本是一样的,只不过concatMap发出去的事件是有序的,而flatMap是无序的


(15) buffer()

从需要发送的事件当中获取一定数量的事件,并将这些事件放到缓冲区当中一并发出

buffer 有2个参数,一个是count ,另一个是skip。 count 缓冲区元素的数量,skip 代表缓冲区满后,发送下一次事件序列的时候要跳过多少元素


 Observable.just(1,2,3,4,5).buffer(3,1).subscribe(new Observer<List<Integer>>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("zhoujian", "onSubscribe");
            }

            @Override
            public void onNext(List<Integer> integers) {
                Log.i("zhoujian", "缓冲区大小-----------:"+integers.size());
                for (Integer i: integers){
                    Log.i("zhoujian", "缓冲区元素:"+i);
                }
            }

            @Override
            public void onError(Throwable e) {
                Log.i("zhoujian", "onError");
            }

            @Override
            public void onComplete() {
                Log.i("zhoujian", "onComplete");
            }
        });
        

打印结果:

06-25 16:15:23.796 18271-18271/com.zhoujian.rxjavademo I/zhoujian: onSubscribe
06-25 16:15:23.796 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区大小-----------:3
06-25 16:15:23.796 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:1
06-25 16:15:23.796 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:2
06-25 16:15:23.796 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:3
06-25 16:15:23.796 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区大小-----------:3
06-25 16:15:23.796 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:2
06-25 16:15:23.796 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:3
06-25 16:15:23.796 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:4
06-25 16:15:23.797 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区大小-----------:3
06-25 16:15:23.797 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:3
06-25 16:15:23.797 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:4
06-25 16:15:23.797 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:5
06-25 16:15:23.797 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区大小-----------:2
06-25 16:15:23.797 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:4
06-25 16:15:23.797 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:5
06-25 16:15:23.797 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区大小-----------:1
06-25 16:15:23.797 18271-18271/com.zhoujian.rxjavademo I/zhoujian: 缓冲区元素:5
06-25 16:15:23.797 18271-18271/com.zhoujian.rxjavademo I/zhoujian: onComplete

RxJava上篇

RxJava中篇

RxJava下篇

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值