资讯专栏INFORMATION COLUMN

慕课网_《RxJava与RxAndroid基础入门》学习总结

刘明 / 666人阅读

时间:2017年10月16日星期一
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学源码:无
学习源码:https://github.com/zccodere/s...

第一章:课程简介 1-1 课程介绍

本门课程的主要内容

RxJava是什么
RxAndroid是什么
RxJava常用操作符(重点、难点)
怎样在项目中使用RxJava和RxAndroid

如何学习RxJava与RxAndroid

总体总体章节,有初步了解
跟着讲解自己动手实际去敲代码
GitHub上RxJava项目Wiki文档
看RxJava相关博客和优秀文章

为什么学RxJava与RxAndroid

RxJava能提高工作效率
RxJava能优雅解决复杂业务场景
RxJava使用越来越流行
RxJava的优秀特性

本门课程能够学到什么

了解什么是响应式编程
了解RxJava和RxAndroid到底是什么
了解RxJava历史来源
清除RxJava与RxAndroid关系
学会在项目中使用RxJava和RxAndroid

相关资源

RxJava英文文档:https://github.com/ReactiveX/RxJava/wiki
RxJava中文文档:https://mcxiaoke.gitbooks.io/rxdocs/content/
RxJava经典资料:https://github.com/lzyzsd/Awesome-RxJava
1-2 响应式编程

什么是响应式编程

定义:是一种基于异步数据流概念的编程模式
关键概念:事件
使用场景:UI(通用)
第二章:基本概述 2-1 RxJava概述

RxJava是什么

异步数据处理库
扩展的观察者模式

RxJava历史来源

Netflix公司遇到问题
目标:重构当前架构来减少REST调用的次数
尝试:微软RX迁移到JVM

RxJava特点

jar包小于1MB
轻量级框架
支持Java8 lambda
支持Java6及Android 2.3以上
支持异步和同步

扩展的观察者模式

onCompleted()事件:通知完毕事件
onError()事件:通知异常事件
使用组合而不是嵌套,避免陷入回调地狱
2-2 RxAndroid概述

RxAndroid是什么

是RxJava针对Android平台的一个扩展,用于Android开发
提供响应式扩展组件快速、易于开发Android应用程序

Schedulers(调度器)

解决Android主线程问题:针对Android
解决多线程问题

Schedulers示例

2-3 RxJava扩展

观察者模式四大要素

Observable被观察者
Observer观察者
Subscribe订阅
事件

观察者模式图示

RxJava扩展的观察者模式图示

第三章:使用详解 3-1 入门案例

创建名为myrxjava的maven工程pom如下


  4.0.0

  com.myimooc
  myrxjava
  0.0.1-SNAPSHOT
  jar

  myrxjava
  http://maven.apache.org

    
        UTF-8
        1.8
        1.8
        1.8
    

  
    
        io.reactivex
        rxjava
        1.3.2
    
    
      junit
      junit
      4.12
      test
    
  

1.编写HelloWorld类

package com.myimooc.myrxjava;

import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.Subscriber;

/**
 * @title HelloWorld类
 * @describe 3-1 入门案例HelloWorld
 * @author zc
 * @version 1.0 2017-10-16
 */
public class HelloWorld 
{
    @SuppressWarnings({ "deprecation", "rawtypes", "unchecked" })
    public static void main( String[] args )
    {
        
        // 1.创建被观察者
        Observable myObservable = Observable.create(new OnSubscribe(){
            @Override
            public void call(Subscriber subscriber) {
                subscriber.onNext("hello World!");
                throw new NullPointerException("出错啦");
            }
        });
        
        // 2.创建观察者
        Subscriber mySubscriber = new Subscriber(){
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(String str) {
                System.out.println("onNext() " + str);
            }
        };
        
        // 3.订阅事件
        myObservable.subscribe(mySubscriber);
    }
}
3-2 创建操作

操作符的分类

Creating Observables(创建Observable:创建操作)
Transforming Observables(转换Observable:转换操作)
Filtering Observables(过滤Observable:过滤操作)
Combining Observables(组合Observable:组合操作)
Error Handling Operators(处理错误)

Creating Observables(创建Observable)

Create
Just
From
Defer
Empty/Never/Throw
Interval
Range
Repeat
Start
Timer

代码编写

1.编写CreatingObservables类

package com.myimooc.myrxjava;

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

import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.functions.Func0;
import rx.Subscriber;

/**
 * @title 创建操作符
 * @describe 创建操作符演示
 * @author zc
 * @version 1.0 2017-10-16
 */
@SuppressWarnings("unused")
public class CreatingObservables {
    
    public static void main(String[] args) {
//        create();
//        just();
//        from();
//        defer();
        repeat();
    }
    
    /**
     * repeat操作符
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    private static void repeat() {
        Observable observable= Observable.range(1,5).repeat(2);
        observable.subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }
    
    /**
     * range操作符
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    private static void range() {
        Observable observable= Observable.range(1,5);
        observable.subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    private static String deferStr = "default";
    /**
     * defer操作符
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    private static void defer() {
        Observable observable= Observable.defer(new Func0>() {
            @Override
            public Observable call() {
                return Observable.just(deferStr);
            }
        });
        deferStr = "RxJava";
        observable.subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(String str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * from操作符
     */
    private static void from() {
        List nums = new ArrayList();
        nums.add(1);
        nums.add(2);
        nums.add(3);
        nums.add(4);
        nums.add(5);
        Observable.from(nums).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * just操作符
     */
    private static void just() {
        Observable.just("RxJava").subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(String str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * Create操作符
     */
    private static void create() {
        Observable.unsafeCreate(new OnSubscribe(){
            @Override
            public void call(Subscriber subscriber) {
                subscriber.onNext("RxJava");
            }
        }).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(String str) {
                System.out.println("onNext(): " + str);
            }
        });
    }
}
3-3 转换操作

Transforming Observables(转换Observable)

Map
FlatMap
GroupBy
Buffer
Scan
Window

代码编写

1.编写TransformingObservables类

package com.myimooc.myrxjava;

import java.util.List;

import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.functions.Func1;
import rx.functions.Func2;
import rx.observables.GroupedObservable;

/**
 * @title 转换操作符
 * @describe 转换操作符演示
 * @author zc
 * @version 1.0 2017-10-16
 */
@SuppressWarnings("unused")
public class TransformingObservables {
    
    public static void main(String[] args) {
//        transformMap();
//        transformFlatMap();
//        transformGroupBy();
//        transformBuffer();
        transformScan();
    }

    /**
     * Scan操作符:对数据进行累加
     */
    private static void transformScan() {
        Observable.range(1,5).scan(new Func2() {
            
            @Override
            public Integer call(Integer sum, Integer num) {
                return sum + num;
            }
            
        }).subscribe(new Observer() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * Buffer操作符:分批读取数据
     */
    private static void transformBuffer() {
        Observable.range(1,5).buffer(2).subscribe(new Observer>() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(List str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * GroupBy操作符:对数据进行分组操作
     */
    private static void transformGroupBy() {
        Observable.just(1,2,3,4,5).groupBy(new Func1(){

            @Override
            public Integer call(Integer data) {
                return data % 2;
            }
            
        }).subscribe(new Observer>() {
            @Override
            public void onCompleted() {
            }
            @Override
            public void onError(Throwable arg0) {
            }
            @Override
            public void onNext(final GroupedObservable groupedObservable) {
                groupedObservable.subscribe(new Subscriber() {

                    @Override
                    public void onCompleted() {
                    }
                    @Override
                    public void onError(Throwable arg0) {
                    }
                    @Override
                    public void onNext(Integer data) {
                        System.out.println("group:" + groupedObservable.getKey() + " data:" + data);
                    }
                });
            }
        });
    }

    /**
     * FlatMap操作符:一个对象转换为多个对象
     */
    private static void transformFlatMap() {
        
        Observable.just(1,2,3,4,5).flatMap(new Func1>(){

            @Override
            public Observable call(Integer num) {
                return Observable.just(String.valueOf(num));
            }
            
        }).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(String str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * Map操作符:一个对象转换为另一个对象
     */
    private static void transformMap() {
        
        Observable.just(123).map(new Func1(){

            @Override
            public String call(Integer num) {
                return String.valueOf(num);
            }
            
        }).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(String str) {
                System.out.println("onNext(): " + str);
            }
        });
    }
    
    
}
3-4 过滤操作

Filtering Observables(过滤Observable)

Debounce
Distinct
ElementAt
Filter
First
IgnoreElements
Last
Sample
Skip
SkipLast
Take
TakeLast

代码编写

1.编写FilteringObservables类

package com.myimooc.myrxjava;

import java.util.concurrent.TimeUnit;

import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.Observer;
import rx.Subscriber;
import rx.functions.Func1;
import rx.functions.Func2;

/**
 * @title 过滤操作符
 * @describe 过滤操作符演示
 * @author zc
 * @version 1.0 2017-10-17
 */
@SuppressWarnings("unused")
public class FilteringObservables {
    
    public static void main(String[] args) {
//        filterDebounce();
//        filterDistinct();
//        filterElementAt();
//        filterFilter();
//        filterIgnoreElements();
//        filterLast();
//        filterSample();
//        filterSkip();
        filterTake();
    }

    /**
     * Take操作符:取对应数据项
     */
    private static void filterTake() {
        Observable.just(1,2,3,4).takeLast(2).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * Skip操作符:跳过数据项
     */
    private static void filterSkip() {
        Observable.just(1,2,3,4).skipLast(2).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * Sample操作符:取样
     */
    private static void filterSample() {
        Observable.unsafeCreate(new OnSubscribe(){
            @Override
            public void call(Subscriber arg) {
                try{
                    for (int i=0;i<10;i++){
                        Thread.sleep(1000);
                        arg.onNext(i);
                    }
                    arg.onCompleted();
                }catch (Exception e) {
                    arg.onError(e);
                }
            }
        }).sample(4, TimeUnit.SECONDS).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()" + arg0.getMessage());
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * Last操作符:取数据项最后一个数据
     */
    private static void filterLast() {
        Observable.just(1,2,3,2,3).last().subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * IgnoreElements操作符:忽略掉指定元素,直接回调onCompleted或onError方法
     */
    private static void filterIgnoreElements() {
        Observable.unsafeCreate(new OnSubscribe() {
            @Override
            public void call(Subscriber arg) {
                arg.onNext(123);
                arg.onCompleted();
//                throw new NullPointerException();
            }
        }).ignoreElements().subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()" + arg0.getMessage());
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * Filter操作符:过滤
     */
    private static void filterFilter() {
        Observable.just(1,2,3,2,3).distinct().filter(new Func1() {
            @Override
            public Boolean call(Integer arg) {
                return arg > 1;
            }
        }).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * ElementAt操作符:取出指定位置的元素
     */
    private static void filterElementAt() {
        Observable.just(1,2,3,2,3).elementAt(3).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * Distinct操作符:去重操作符
     */
    private static void filterDistinct() {
        Observable.just(1,2,3,2,3).distinct().subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * Debounce操作符:在操作后指定时间内无操作时响应
     */
    private static void filterDebounce() {
        Observable.unsafeCreate(new OnSubscribe(){
            @Override
            public void call(Subscriber arg) {
                try{
                    for (int i=0;i<10;i++){
                        Thread.sleep(2000);
                        arg.onNext(i);
                    }
                    arg.onCompleted();
                }catch (Exception e) {
                    arg.onError(e);
                }
            }
        }).debounce(1,TimeUnit.SECONDS).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }
    
    

}
3-5 组合操作

Combining Observables(组合Observable)

Zip
Merge
StartWith
CombineLatest
Join
SwitchOnNext

代码编写

1.编写CombiningObservables类

package com.myimooc.myrxjava;

import rx.Observable;
import rx.Subscriber;
import rx.functions.Func2;

/**
 * @title 组合操作符
 * @describe 组合操作符演示
 * @author zc
 * @version 1.0 2017-10-17
 */
@SuppressWarnings("unused")
public class CombiningObservables {
    
    public static void main(String[] args) {
//        combiningZip();
//        combiningMerge();
//        combiningStartWith();
        combiningCombineLatest();
    }
    
    /**
     * 用于将两个Observable最近传递的数据通过Func2函数的规则进行组合
     */
    @SuppressWarnings("static-access")
    private static void combiningCombineLatest() {
        Observable first = Observable.just(1,3,5);
        Observable second = Observable.just(2,4,6);
        
        first.combineLatest(first,second,new Func2(){
            @Override
            public Integer call(Integer num1, Integer num2) {
                System.out.println("num1 = "+num1 + " num2 = "+num2);
                return num1 + num2;
            }
        }).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * 用于在源Observable传递的数据前增加数据
     * 使用startWith(Iterable),还可以在源Observable传递的数据前增加Iterable
     */
    private static void combiningStartWith() {
        Observable first = Observable.just(1,3,5);
        Observable second = Observable.just(2,4,6);
        
        first.startWith(second).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * 将两个Observable通知的事件序列合并成一个事件序列,就行是一个Observable通知的一样
     * 可以简单的将它理解为两个Observable合并成了一个Observable
     */
    private static void combiningMerge() {
        Observable observable1 = Observable.just(1,3,5);
        Observable observable2 = Observable.just(2,4,6);
        
        Observable.merge(observable1,observable2).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
    }

    /**
     * 用来合并两个Observable传递的数据项,根据Func2函数生成一个新的值并传递出去
     * 当其中一个Observable传递数据结束或者出现异常后,另一个Observable也将停止传递数据
     */
    private static void combiningZip() {
        Observable observable1 = Observable.just(10,20,30);
        Observable observable2 = Observable.just(4,8,12,16);
        
        Observable.zip(observable1,observable2, new Func2(){
            @Override
            public Integer call(Integer integer1, Integer integer2) {
                return integer1 + integer2;
            }
        }).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }
            @Override
            public void onError(Throwable arg0) {
                System.out.println("onError()");
            }
            @Override
            public void onNext(Integer str) {
                System.out.println("onNext(): " + str);
            }
        });
        
    }

    
    
}
3-6 处理错误

Error Handling Operators(处理错误)

Catch
Retry
第四章:线程控制 4-1 Java调度器

Schedulers(调度器)

调度器(Schedulers)是RxJava以一种及其简单的方式来解决多线程问题机制

Schedulers(调度器)种类

io()
    IO相关的操作
    这个调度器用于IO操作
computation()
    进行计算的操作
    这个是计算工作默认的调度器,与IO操作无关
    例如:buffer()、debounce()、delay()、interval()、sample()、skip()
immediate()
    立即执行的操作
    这个调度器允许你立即在当前线程执行你指定的工作
    例如:timeout()、timeInterval()、timestamp()
newThread()
    创建一个新的线程
    它为指定任务启动一个新的线程
trampoline()
    按照顺序进行处理
    调度器会按序处理队列,并运行队列中每一个任务
    例如:repeat()、retry()
4-2 Android调度器

AndroidSchedulers

AndroidSchedulers是RxAndroid库提供在安卓平台的调度器(指定观察者在主线程)

代码示例

4-3 非阻塞IO操作

非阻塞IO操作:图片保存

阻塞与非阻塞IO操作比较

4-4 指定线程

SubscribeOn

RxJava提供了subscribeOn()方法来用于每个Observable对象

ObserveOn

RxJava提供了observeOn()方法来用于每个Subscriber(Observer)对象

网络请求实例

第五章:课程总结 5-1 课程总结

课程总结

理解响应式编程
清楚RxJava和RxAndroid是什么
了解RxJava各种操作符
了解RxJava扩展的观察者模式与一般观察者模式的区别
了解RxJava线程调度器(Schedulers)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67787.html

相关文章

  • 课网_《Spring入门篇》学习总结

    摘要:入门篇学习总结时间年月日星期三说明本文部分内容均来自慕课网。主要的功能是日志记录,性能统计,安全控制,事务处理,异常处理等等。 《Spring入门篇》学习总结 时间:2017年1月18日星期三说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://git...

    Ververica 评论0 收藏0
  • 课网_《Netty入门之WebSocket初体验》学习总结

    时间:2018年04月11日星期三 说明:本文部分内容均来自慕课网。@慕课网:https://www.imooc.com 教学源码:https://github.com/zccodere/s... 学习源码:https://github.com/zccodere/s... 第一章:课程介绍 1-1 课程介绍 什么是Netty 高性能、事件驱动、异步非阻塞的IO Java开源框架 基于NIO的客户...

    Noodles 评论0 收藏0
  • 课网_《SpringMVC数据绑定入门学习总结

    摘要:数据绑定入门学习总结时间年月日星期日说明本文部分内容均来自慕课网。慕课网教学示例源码个人学习源码第一章课程介绍数据绑定入门概述数据绑定概念来自百度百科简单绑定是将一个用户界面元素控件的属性绑定到一个类型对象实例上的某个属性的方法。 《SpringMVC数据绑定入门》学习总结 时间:2017年2月19日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.co...

    Karrdy 评论0 收藏0

发表评论

0条评论

刘明

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<