RxAndroid/java小记

Rxandroid

作为一个在设计模式中能把MVP发挥的淋漓尽致的框架不去学习感觉真的对不起自己,然后也学点新东西吧,响应式编程,MVP观察者模式,然后使用RxAndroid使我们自己的代码更加简洁

然后昨天看了一个文章说,接口调用频繁使用的话会使你的整个代码看起来非常难以理解,其实想想也是,一个读者看到了你的代码,然后却发现你的代码里充斥着接口回调,哎,这时候

他就需要寻找你这个接口到底回调到了哪里(想想也是这个道理啊);

所以Rx(Android、java)系列很好解决了这个问题,我也是昨天才意识到,因为你可以把所需要执行的任务和任务产生的回调放在同一个地方,然后这个时候,就不需要找来找去了吧

一目了然,任务(耗时任务或者不耗时任务)执行地,任务返回值以及后续的处理都以链式的形式调用;

MVP是啥

即Model view Presenter,

mvp模式可以分离显示层和逻辑层,他们之间通过接口进行通信(好像我之前很多都是用接口通信的诶!冥冥中也有用到mvp模式),降低耦合;

从图中可以看出Presenter分别和Model和view交互,而view和Model之间并没有直接联系

这样随着我们的业务在拓展然后UI改变的话,或者业务逻辑改变UI也有修改的话,如果不分开,那将是一件非常头疼的事,因为你都要两者兼顾,但是现在你只需要

专心专注于UI界面或者业务逻辑的修改了!嗯 ,差不多MVP就是这个好处吧

然后是RxAndroid

rxandroid是rxjava的扩展,然后使用起来的话有提供很多方法给我们进行任务的操作

如just,map,fromCallable等。然后是两个重要的类Observable(事件发布者,被观察者),Observer(观察者,事件订阅者,Subscription(事件订阅者)。

just方法使用

just方法适用于不耗时的任务,同步方法

//事件发布者
    Observable<String> listObservable;
/**just测试,这里的getString是一个简单的返回String的函数(不贴出来)*/
     listObservable = Observable.just(getString());

listObservable.subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.v("test","OnCompleted");
            }

            @Override
            public void onError(Throwable e) {
                Log.v("test","OnError"+e);
            }

            @Override
            public void onNext(String s) {
                textView.setText(s);
                Log.v("test","OnNext:------"+s);
            }
        });

如上代码just()方法参数内可以传入一个值,值的类型由事件发布者在定义时规定,应与其保持一致。值获取成功后将通知onNext函数“发布”。

然后我们就可以在onNext函数进行相关操作了。这是简单的使用,然而rxandroid精髓之处在于对线程的操作(虽然我会说,但是感觉还是没有完全理解)

fromCallable()方法

just方法只是一个基础的方法,然而在实际情况中我们会有很多耗时的操作比如,网络请求,比如数据库存储等等,这个时候我们就需要用到异步的方法

fromcallbale用法和just类似,但是多了些控制线程的东西

/**长时间耗时任务测试*/
        listObservable = Observable.fromCallable(new Callable<String>() {
            @Override
            public String call() throws Exception {
                return getStringLongTime();
            }
        });

Subscription mtvSubscription = listObservable
                .subscribeOn(Schedulers.io())  //指定Observable中的方法运行的线程
                .observeOn(AndroidSchedulers.mainThread())//指定onNext运行线程
                .subscribe(new Observer<String>() {
                    @Override
                    public void onCompleted() {
                        Log.v("test_CallAble","OnCompled:------");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.v("test_CallAble","OnError:------"+e);
                    }

                    @Override
                    public void onNext(String s) {
                        textView.setText(s);
                        Log.v("test_CallAble","OnNext:------"+s);
                    }
                });

被观察者new了一个Callable的实例,里面运行长时间耗时任务,完成后将异步通知观察者的OnNext方法

subscribOn是指定Observable运行的线程

observeOn是指定观察者OnNext方法所执行的线程

map方法

这里copy一下大神的代码过来,表述了map的使用方法,自行领会 debounce设置延迟时间

mTextWatchSubscription = mSearchResultsSubject
    .debounce(400, TimeUnit.MILLISECONDS)//设置400毫秒等待时间
    .observeOn(Schedulers.io())
    .map(new Func1<String, List<String>>() {

        @Override
        public List<String> call(String s) {
            return mRestClient.searchForCity(s);
        }
    })
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<List<String>>() { 

        @Override
        public void onCompleted() { }

        @Override
        public void onError(Throwable e) { } 

        @Override
        public void onNext(List<String> cities) {
            handleSearchResults(cities);
        }
    });

mSearchInput.addTextChangedListener(new TextWatcher() {

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        //有text改变时,调用onNext方法
        mSearchResultsSubject.onNext(s.toString());
    }

    @Override
    public void afterTextChanged(Editable s) { }
});

图片引用自:Android 源码 设计模式 解析与实战 【何红辉,关爱民著】

部分代码copy自博客园作者:还没好好感受年轻

时间: 2024-11-14 20:21:28

RxAndroid/java小记的相关文章

JAVA小记 ..

JVM: Java虚拟机  JVM个数取决于同时执行的程序个数 JDK:JAVA 开发工具包 Java利用JVM实行跨平台 JRE:Java运行环境 JavaSE:企业版 GC:垃圾回收机制 命名规范: 类:  首字母大写 方法: 首字母小写,中间每个单词大写 变量: 首字母小写 , 中间每个单词大写 包: 由小写组成 常量: 全大写 Java注释方法: 1)单行注释    “//”   只能注释一行 2)块注释    "/*  */"    跨多行 Java8种原始类型 byte.s

JAVA小记(一)

java中向上转型.向下转型.内部类中所需注意的问题: 向上转型与向下转型: 举个例子:有2个类,Father是父类,Son类继承自Father. Father f1 = new Son();   // 这就叫 upcasting (向上转型) // 现在f1引用指向一个Son对象 Son s1 = (Son)f1;   // 这就叫 downcasting (向下转型) // 现在f1还是指向Son对象 但是我们在向下转型的时候不能这样子做: Father f2 = new Father();

Intel项目Java小记

cannot be cast to javax.servlet.Filter添加provided即可 install -X是什么意思? Unsupported major.minor version 51.0 属性->Java->Compiler->1.6 后来发现是因为:引用的jar包是1.7平台编译过得,我的环境是1.6,所以不过:网上讲述的是1.6编译的jar在1.7的JVM上使用不过:情景不同啊 maven install和maven build的区别 java.lang.NoC

java 小记

request.getContextPath()  获取项目名称,如    /BiYeSheJi getServletContext().getRealPath("/")  获取项目根目录,如  C:\install files\programing software\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\BiYeSheJi\

Java 小记 — RabbitMQ 的实践与思考

前言 本篇随笔将汇总一些我对消息队列 RabbitMQ 的认识,顺便谈谈其在高并发和秒杀系统中的具体应用. 1. 预备示例 想了下,还是先抛出一个简单示例,随后再根据其具体应用场景进行扩展,我觉得这样表述条理更清晰些. RabbitConfig: @Configuration public class RabbitConfig { @Bean public Queue callQueue() { return new Queue(MQConstant.CALL); } } Client: @Co

Java基础学习小记--多态

题外话:总结了多年的学习心得,不得不说,睡眠是一个学习者的必需品!所谓“早起毁一天”不是没有道理哪,特别对Coders来说,有几天不是加班到夜里.好吧,我承认对于初学Java的我,昨日头脑顿路,Java的继承与多态,看得我是有点小懵逼.其实大致是懂了,不过到了具体应用中,特别是比较复杂的继承和调用关系的时候些许迷路.好了,话不多说,明日再把继承和多态来个总结,今日先对多态来个小记. ---------------------------------------------------------

java中断小记(二)

在上一篇博文中,介绍了成员方法interrupt()的用法,这篇接上上篇继续介绍剩下的两个与中断有关的方法. 2.成员方法new Thread().isInterrupted() 通常使用Thread.currentThread().isInterrupted()方法判断某个线程是否已被发送过中断请求(某一线程被发送过中断请求后并一定会中断),因为它将线程中断标示位设置为true后,不会立刻清除中断标示位,即不会将中断标设置为false.程序示例如下: package com.szw.test;

使用Maven自动部署Java Web项目到Tomcat问题小记

导读 首先说说自己为啥要用maven管理项目,一个直接的原因是:我在自己电脑上开发web项目,每次部署到服务器上时都要经历如下步骤: 首先在Eclipse里将项目打包成war包 将服务器上原来的项目文件夹删掉 cd /var/lib/tomcat7/webapps sudo rm XXX.war sudo rm -rf XXX 将war包传到服务器上,比如用pscp命令上传 pscp -pw "xxx" XXX.war [email protected]:/var/lib/tomcat

Java 接口和抽象类小记

Java 接口和抽象类小记 @author ixenos 接口 1.接口没有构造函数,因为接口是不能被实例化的2.匿名对象如果使用接口的构造器也只是表示了一个协变的实现了接口的匿名对象3.接口里面的成员变量默认都是public static final类型的.必须被显示的初始化.4.接口里面的方法默认都是public abstract类型的.隐式声明.5.接口不能实现另一个接口,但可以继承多个接口.6.类如果实现了一个接口,那么必须实现接口里面的所有抽象方法 抽象类 1.若果在父类中(这里就是你