zoukankan      html  css  js  c++  java
  • RxJava

    public class LoginActivity extends BaseActivity implements LoginView {


    Handler handler = new Handler();

    @Override
    protected int getLayoutId() {
    return R.layout.activity_main;
    }

    @Override
    protected void initDatas() {
    /**
    * 1、初始的RxJava
    */
    // rxJavaDemo();
    /**
    * 2、简洁版的RxJava
    */
    // rxJavaDemo_concise();
    /**
    * 3、用操作符来进行操作Rxjava
    */
    // rxJavaDemo_operator();


    /**
    * 4、深的操作符号(*****)
    */
    // rxJavaDemo_operator_more();

    /**
    * 5、更深的操作符号(主要是讲 onComplete()和onError() )
    * 这两个函数用来通知订阅者,被观察的对象将停止发送数据以及为什么停止(成功的完成或者出错了)。
    *
    * 还有RxJava 线程调度的问题
    */
    // rxJavaDemo_operator_more_more();

    /***
    * Rxjava 在Android 中应用
    */
    rxJavaDemo_operator_more_more_android();

    }


    /**
    * 接着要介绍的就是AndroidObservable,它提供了跟多的功能来配合Android的生命周期。
    * bindActivity()和bindFragment()方法默认使用AndroidSchedulers.mainThread()来执行观察者代码,这两个方法会在Activity或者Fragment结束的时候通知被观察者停止发出新的消息。
    */
    private void rxJavaDemo_operator_more_more_android() {

    }

    private void rxJavaDemo_operator_more_more() {
    Subscription a = Observable.just("这个在的线程是:").subscribeOn(Schedulers.io())//订阅者发生在 工作线程中 即io
    .observeOn(AndroidSchedulers.mainThread())//发生在主线程中 即 观察者 在 main线程中
    .subscribe(s -> showMessagers(s));
    //停止当前的操作 RxJava的另外一个好处就是它处理unsubscribing的时候,会停止整个调用链。
    // 如果你使用了一串很复杂的操作符,调用unsubscribe将会在他当前执行的地方终止。不需要做任何额外的工作!
    // a.unsubscribe();
    new View(this).postDelayed(() -> a.unsubscribe(), 2000);

    }

    /**
    * 相比更加详细的操作符学习
    */
    private void rxJavaDemo_operator_more() {
    // Observable.from()方法,它接收一个集合作为输入,然后每次输出一个元素给subscriber:
    // ArrayList<String> list = new ArrayList<>();
    //
    // list.add("d");
    // list.add("ddddd");
    // String[] arrays = {"d", "b"};
    // Observable.from(list).subscribe(s -> showMessagers(s));

    //将list数据给观察者 这个为比较复杂的写法了
    getDbDatas().subscribe(listData -> {
    Observable.from(listData).subscribe(listSring -> showMessagers(listSring));
    });
    /**
    * 这个是用flatmap写的 相对来说要简单很多
    */
    getDbDatas().flatMap(new Func1<List<String>, Observable<String>>() {
    @Override
    public Observable<String> call(List<String> strings) {
    return Observable.from(strings);
    }
    }).subscribe(s -> showMessagers(s));
    /**
    * 用兰博啦来写就更简单了
    */
    getDbDatas().flatMap(listData -> Observable.from(listData)).subscribe(listString -> showMessagers(listString));


    /**
    * 接着前面的例子,现在我不想打印URL了,而是要打印收到的每个网站的标题。
    * 问题来了,我的方法每次只能传入一个URL,并且返回值不是一个String,
    * 而是一个输出String的Observabl对象。使用flatMap()可以简单的解决这个问题。
    */

    getDbDatas().flatMap(stringList -> Observable.from(stringList)).flatMap(stringData -> getTitle(stringData)).subscribe(title -> showMessagers(title));

    /**
    * filter()输出和输入相同的元素,并且会过滤掉那些不满足检查条件的。
    * take()如果我们只想要最多5个结果:
    * doOnNext()允许我们在每次输出一个元素之前做一些额外的事情,比如这里的保存标题。
    */
    getDbDatas().flatMap(stringList -> Observable.from(stringList)).flatMap(stringData -> getTitle(stringData)).filter(title -> title != null).take(5).doOnNext(title -> saveTitle(title)).subscribe(title -> showMessagers(title));


    }


    /**
    * 保存标题等操作
    */
    public void saveTitle(String t) {

    }

    /**
    * 根据 string 串来进行查询Title
    */
    Observable<String> getTitle(String URL) {
    String data = "data";
    return Observable.just(data);
    }


    /**
    * 返回Observable<String>数据
    *
    * @return
    */
    public Observable<String> getStringData() {
    return Observable.just("数据");
    }


    /**
    * 得到Observable<List<String>>对象
    *
    * @return
    */
    public Observable<List<String>> getDbDatas() {
    List listData = new ArrayList();
    listData.add("a");
    listData.add("b");
    listData.add("c");
    listData.add("d");
    return Observable.just(listData);
    }


    /**
    * 用RxJava中操作符来进行操作 map就是来进行对observable改变的 map()操作符就是用于变换Observable对象的
    */
    private void rxJavaDemo_operator() {
    Observable.just("这个是操作符的操作哦").map(s -> s + "demo").subscribe(s -> showMessagers(s));
    Observable.just("操作符号哦222222").map(s -> s.hashCode()).subscribe(s -> showMessagers(s.toString()));//中间对 observable 进行改变 变成hash 值
    Observable.just("操作符号哦3333复杂的").map(s -> s.hashCode()).map(i -> Integer.toString(i)).subscribe(s -> showMessagers(s));//连续两个map进行转接
    }

    /**
    * 简洁版本的 RxJava
    */
    private void rxJavaDemo_concise() {
    /**
    * 比如Observable.just就是用来创建只发出一个事件就结束的Observable对象,上面创建Observable对象的代码可以简化为一行
    */
    Observable<String> myObservable = Observable.just("这个是只发出一个事件的-->这个是RxJava");
    /**
    * 接下来看看如何简化Subscriber,上面的例子中,我们其实并不关心OnComplete和OnError,我们只需要在onNext的时候做一些处理,这时候就可以使用Action1类。
    */
    Action1<String> onNextAction = new Action1<String>() {
    @Override
    public void call(String s) {
    //相当于Subscriber中的接受
    Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show();
    }
    };
    myObservable.subscribe(onNextAction);

    //其实上面的完全可以写成这样的哦
    Observable.just("结合到一起的写法").subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
    Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show();
    }
    });
    //或者用lambda表达式的写法 这个就更简单了哦~~~~
    Observable.just("lambda表达式的写法 看看星星").subscribe(s -> Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show());


    }


    /**
    * Observable 被观察者 Subscribers 观察者
    */
    private void rxJavaDemo() {
    /**
    * 创建观察者模式 --> 被观察者
    *
    * 一个Observable可以发出零个或者多个事件,知道结束或者出错。
    * 每发出一个事件,就会调用它的Subscriber的onNext方法,最后调用Subscriber.onNext()或者Subscriber.onError()结束。
    */
    Observable<String> myObservable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
    subscriber.onNext("这是RxJava");
    subscriber.onCompleted();
    }
    });
    /**
    * 接着我们创建一个Subscriber来处理Observable对象发出的字符串。
    *
    */
    Subscriber<String> mySubscriber = new Subscriber<String>() {
    @Override
    public void onCompleted() {
    Toast.makeText(LoginActivity.this, "完成啦...", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onNext(String s) {
    Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show();
    }
    };
    /**
    * 这里subscriber仅仅就是打印observable发出的字符串。
    * 通过subscribe函数就可以将我们定义的myObservable对象和mySubscriber对象关联起来,这样就完成了subscriber对observable的订阅。
    */
    myObservable.subscribe(mySubscriber);

    }

    @Override
    protected void initListeners() {

    }

    @Override
    protected void initViews(Bundle savedInstanceState) {

    }

    @Override
    public void showMessagers(String message) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
  • 相关阅读:
    ASP.NET Core 中间件的使用(二):依赖注入的使用
    ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
    附029.Kubernetes安全之网络策略
    C# 9.0中引入的新特性init和record的使用思考
    拥抱云原生,如何将开源项目用k8s部署?
    Angular实战之使用NG-ZORRO创建一个企业级中后台框架(进阶篇)
    Angular实战之使用NG-ZORRO创建一个企业级中后台框架(入门篇)
    Angular入门,开发环境搭建,使用Angular CLI创建你的第一个Angular项目
    (已解决)'ng' 不是内部或外部命令,也不是可运行的程序或批处理文件
    如何免费扩展谷歌网盘的容量
  • 原文地址:https://www.cnblogs.com/jeno-song/p/6405503.html
Copyright © 2011-2022 走看看