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自博客园作者:还没好好感受年轻
RxAndroid/java小记的更多相关文章
- java 小记
1.获取web项目根目录的绝对路径 request.getContextPath() 获取项目名称,如 /BiYeSheJi getServletContext().getRealPath(& ...
- Intel项目Java小记
cannot be cast to javax.servlet.Filter添加provided即可 install -X是什么意思? Unsupported major.minor version ...
- Java 小记 — Spring Boot 的实践与思考
前言 本篇随笔用于记录我在学习 Java 和构建 Spring Boot 项目过程中的一些思考,包含架构.组件和部署方式等.下文仅为概要,待闲时逐一整理为详细文档. 1. 组件 开源社区如火如荼,若在 ...
- JAVA小记 (1)
JVM: Java虚拟机 JVM个数取决于同时执行的程序个数 JDK:JAVA 开发工具包 Java利用JVM实行跨平台 JRE:Java运行环境 JavaSE:企业版 GC:垃圾回收机制 命名规范 ...
- Java 小记 - 时间的处理与探究
前言 时间的处理与日期的格式转换几乎是所有应用的基础职能之一,几乎所有的语言都会为其提供基础类库.作为曾经 .NET 的重度使用者,赖其优雅的语法,特别是可扩展方法这个神级特性的存在,我几乎没有特意关 ...
- JAVA小记(一)
java中向上转型.向下转型.内部类中所需注意的问题: 向上转型与向下转型: 举个例子:有2个类,Father是父类,Son类继承自Father. Father f1 = new Son(); / ...
- JAVA小记
关于重写equals()方法和重写toString()方法,一般来说,Objects的默认子类都重写了这两个方法,直接利用就行了: 对于用户自定义的类,如果要用到这两方法,就必须在程序中重写.
- Java 小记 — Spring Boot 注解
前言 本篇随笔将对 Spring Boot 中的常用注解做一个简单的整理归档,写作顺序将从启动类开始并逐步向内外扩展,目的即为了分享也为了方便自己日后的回顾与查阅. 1. Application 启动 ...
- Java 小记 — RabbitMQ 的实践与思考
前言 本篇随笔将汇总一些我对消息队列 RabbitMQ 的认识,顺便谈谈其在高并发和秒杀系统中的具体应用. 1. 预备示例 想了下,还是先抛出一个简单示例,随后再根据其具体应用场景进行扩展,我觉得这样 ...
随机推荐
- 【实践】js实现随机不重复抽取数组中元素
经过3个星期的时间终于用做完了学校的练习作品了,但是发现在用jq 做互动虽然很方便但却带来了不少的烦恼 所以在以后的日子里我要好好学 js 了! 然后呢在博主之前学java 里面 另我最头痛的就是做产 ...
- Problems with MMM for mysql(译文)
Problems with mmm for mysql posted in MySQL by shlomi 原文:http://code.openark.org/blog/mysql/problems ...
- 视频软件TurboDemo 教程:如何为视频添加旁白和音乐
在前面的文章中,已经对视频软件TurboDemo如何快速的捕捉屏幕和视频编辑做了一些了解,本文主要来了解如何为视频添加旁白和音乐. Slide Timing 在Player Controls窗口中的单 ...
- wex5 实战 框架拓展之2 事件派发与data刷新
一 前言 讲完公共data,相信大家对框架级的data组件级绑定有了更新的认识,接下来我们继续深入,以求研究明白wex5的框架能力. 在一个web项目中,其实有一个data, 是基础框架必须的data ...
- python:点赞功能
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- js实现图片预加载
通过 image标签的onload来实现: 实现原理是用过浏览器的缓存来进行 首先进行循环 for(var i=0;i<10;i++){ //每次进行一个new; var oImg = new ...
- bzoj1007[HNOI2008]水平可见直线
cycleke神说要用半平面交(其实他也用的凸包),把我吓了一跳,后来发现(看题解)其实可以先按斜率排序,再将最小的两条线入栈,如果其与栈顶元素的交点在上一个点的左边,则将栈顶元素出栈.这是一个开口向 ...
- node的 thunkify模块说明
thunkify这种函数其实就是python的decorator方式,对目标方法进行一步步的wrap,但是这种方式和generator结合起来就会威力无穷了,实现自动异步功能. thunkify使用一 ...
- [翻译]lithium 快速上手(QuickStart)
快速入门 经典博客教程 很感谢你尝试Li3!这一部分栏目为那些想了解这个框架可以做什么的php用户所设计.像这样深入代码是一种很好的方式去体会快速应用开发(Rapid Application ...
- 深入了解try catch
@Test public void testWeiXin(){ System.out.println(task()); } private boolean task(){ try { int i = ...