RxJava implements this operator as create.

It is good practice to check the observer’s isUnsubscribed state from within the function you pass tocreate so that your Observable can stop emitting items or doing expensive calculations when there is no longer an interested observer.

创建的这个流,会产生三个值(事件),值可以用户自己定义。
Observable.create(xxxx),返回一个流

  

XXXX方法,是用户自定义的。要实现一个自定义的call方法。
Observable.OnSubscribe<?>,?指定了流产生的事件的值类型,一个事件包含了值的信息。
在流里面,检查外部是否有观察者(observer),如果没有就不用产生事件了。这样可以避免,在没有观察者处理产生的事件时,依然在发出事件。
 
在下述代码里面,流它做的事情是,用红色代码表示,产生4个onNext事件;然后,产生一个onCompleted事件。
然后,观察者,订阅流发出的事件,对流发出的事件做响应,用蓝色代码表示。 
下述代码的事件流:
--onNext---onNext---onNext---onNext---onCompleted--
订阅者对事件进行处理
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> observer) {
try {
if (!observer.isUnsubscribed()) {
for (int i = 1; i < 5; i++) {
observer.onNext(i);
}
observer.onCompleted();
}
} catch (Exception e) {
observer.onError(e);
}
}
} ).subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
} @Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
} @Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
});

结果:

Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.

Scheduler

If you want to introduce multithreading into your cascade of Observable operators, you can do so by instructing those operators (or particular Observables) to operate on particular Schedulers.
 
Scheduler用来定义,流中产生值的操作,在哪个线程工作;订阅者,在哪个线程工作。
 
Some ReactiveX Observable operators have variants that take a Scheduler as a parameter. These instruct the operator to do some or all of its work on a particular Scheduler.
可以指定流的操作是在哪个线程中执行的,通过传入一个Scheduler参数。
 
You can make an Observable act on a particular Scheduler by means of the ObserveOn or SubscribeOn operators. ObserveOn instructs an Observable to call its observer’s onNextonError, and onCompletedmethods on a particular Scheduler; SubscribeOn takes this a step further and instructs the Observable to do all of its processing (including the sending of items and notifications to observers) on a particular Scheduler.
 
你可以让一个流,在某个Scheduler中执行,通过给流的方法ObserveOn,SubscribeOn提供参数Scheduler。
ObserveOn方法,指定流(Observable)在哪个线程中调用观察者(observer)的onNext,onError,onCompleted方法。
SubscribeOn指定流的所有处理,生成事件和值的执行操作,是在哪个线程中执行的。
 

Varieties of Scheduler

You obtain a Scheduler from the factory methods described in the Schedulers class. The following table shows the varieties of Scheduler that are available to you by means of these methods in RxJava:

可以通过Scheduler的工厂方法,取得一个scheduler实例。
根据使用场景,选择合适的Scheduler实例。
 
Scheduler purpose
Schedulers.computation( ) meant for computational work such as event-loops and callback processing; do not use this scheduler for I/O (use Schedulers.io( )instead); the number of threads, by default, is equal to the number of processors
Schedulers.from(executor) uses the specified Executor as a Scheduler
Schedulers.immediate( ) schedules work to begin immediately in the current thread
Schedulers.io( ) meant for I/O-bound work such as asynchronous performance of blocking I/O, this scheduler is backed by a thread-pool that will grow as needed; for ordinary computational work, switch toSchedulers.computation( )
Schedulers.newThread( ) creates a new thread for each unit of work
Schedulers.trampoline( ) queues work to begin on the current thread after any already-queued work
---------------------------------------
完整例子代码
 
1.回调方法执行先后顺序
------->onCreateView------>onActivityCreated---->onDestroy
 
2.执行界面元素注入,初始化界面操作。
 
3.然后,监听点击事件。每次点击的时候,就专门生成一个事件流(Observable),并且生成一个观察者Observer专门订阅事件流发出的事件。
Observer处理发出的事件是在UI线程中进行,事件流调用方法observeOn(AndroidSchedulers.mainThread())来达到。
事件流,产生事件和执行后台操作,则是在一个非线程中执行,调用方法subscribeOn(Schedulers.io())。
 
4.界面销毁的时候
则不再订阅事件流。
 
下述例子,一个事件流的过程:
首先_doSomeLongOperation_thatBlocksCurrentThread执行该操作,然后,依次发出
--onNext--onCompleted--
 
相应的,订阅者,则对发出的事件进行处理。

public class ConcurrencyWithSchedulersDemoFragment extends BaseFragment {

    @InjectView(R.id.progress_operation_running) ProgressBar _progress;
@InjectView(R.id.list_threading_log) ListView _logsList; private LogAdapter _adapter;
private List<String> _logs;
private Subscription _subscription; @Override
public void onDestroy() {
super.onDestroy();
if (_subscription != null) {
_subscription.unsubscribe();
}
} @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
_setupLogger();
} @Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.fragment_concurrency_schedulers, container, false);
ButterKnife.inject(this, layout);
return layout;
} @OnClick(R.id.btn_start_operation)
public void startLongOperation() { _progress.setVisibility(View.VISIBLE);
_log("Button Clicked"); _subscription = AppObservable.bindFragment(this, _getObservable()) // Observable,相当于是stream,流
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(_getObserver()); // Observer
} private Observable<Boolean> _getObservable() {
return Observable.create(new Observable.OnSubscribe<Boolean>() { @Override
public void call(Subscriber<? super Boolean> observer) { if(!observer.isUnsubscribed())
{
_log("Within Observable"); _doSomeLongOperation_thatBlocksCurrentThread();
observer.onNext(true);
observer.onCompleted();
} }
});
} /**
* Observer that handles the result List<Integer> from Observable
* through the 3 important actions:
*
* 1. onCompleted
* 2. onError
* 3. onNext
*/
private Observer<Boolean> _getObserver() {
return new Observer<Boolean>() { @Override
public void onCompleted() {
_log("On complete");
_progress.setVisibility(View.INVISIBLE);
} @Override
public void onError(Throwable e) {
Timber.e(e, "Error in RxJava Demo concurrency");
_log(String.format("Boo Error %s", e.getMessage()));
_progress.setVisibility(View.INVISIBLE);
} @Override
public void onNext(Boolean aBoolean) {
_log(String.format("onNext with return value \"%b\"", aBoolean));
}
};
} // -----------------------------------------------------------------------------------
// Method that help wiring up the example (irrelevant to RxJava) private void _doSomeLongOperation_thatBlocksCurrentThread() {
_log("performing long operation"); try {
Thread.sleep(3000); } catch (InterruptedException e) {
Timber.d("Operation was interrupted");
}
} private void _log(String logMsg) { if (_isCurrentlyOnMainThread()) {
_logs.add(0, logMsg + " (main thread) ");
_adapter.clear();
_adapter.addAll(_logs);
} else {
_logs.add(0, logMsg + " (NOT main thread) "); // You can only do below stuff on main thread.
new Handler(Looper.getMainLooper()).post(new Runnable() { @Override
public void run() {
_adapter.clear();
_adapter.addAll(_logs);
}
});
}
} private void _setupLogger() {
_logs = new ArrayList<String>();
_adapter = new LogAdapter(getActivity(), new ArrayList<String>());
_logsList.setAdapter(_adapter);
} private boolean _isCurrentlyOnMainThread() {
return Looper.myLooper() == Looper.getMainLooper();
} private class LogAdapter
extends ArrayAdapter<String> { public LogAdapter(Context context, List<String> logs) {
super(context, R.layout.item_log, R.id.item_log, logs);
}
}
}

  

参考资料:http://reactivex.io/documentation/operators/create.html
https://github.com/ReactiveX/RxJava/wiki/The-RxJava-Android-Module

函数式编程--响应式编程 ---android应用例子的更多相关文章

  1. iOS-函数式编程 && 响应式编程概念

    作为一个iOS developer,那么你一定用过Masnory / SnapKit: Masonry是一个OC开发中,非常好用的自动布局的第三方框架: SnapKit是Masonry团队打造的swi ...

  2. 函数式响应式编程 - Functional Reactive Programming

    我们略过概念,直接看函数式响应式编程解决了什么问题. 从下面这个例子展开: 两个密码输入框,一个提交按钮. 密码.确认密码都填写并一致,允许提交:不一致提示错误. HTML 如下: <input ...

  3. 深入浅出-iOS函数式编程的实现 && 响应式编程概念

    简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 配图 ...

  4. [HMLY]11.iOS函数式编程的实现&&响应式编程概念

    简介 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助. 作为一 ...

  5. RxJava(一):响应式编程与Rx

    一,响应式编程 响应式编程是一种关注于数据流(data streams)和变化传递(propagation of change)的异步编程方式. 1.1 异步编程 传统的编程方式是顺序执行的,必须在完 ...

  6. 使用Reactor响应式编程

    介绍 响应式编程 响应式编程不同于我们熟悉的命令式编程,我们熟悉的命令式编程即代码就是一行接一行的指令,按照它们的顺序一次一条地出现.一个任务被执行,程序就需要等到它执行完了,才能执行下一个任务.每一 ...

  7. 07-Spring5 WebFlux响应式编程

    SpringWebFlux介绍 简介 SpringWebFlux是Spring5添加的新模块,用于Web开发,功能和SpringMvc类似的,WebFlux使用当前一种比较流行的响应式编程框架 使用传 ...

  8. 【响应式编程的思维艺术】 (1)Rxjs专题学习计划

    目录 一. 响应式编程 二. 学习路径规划 一. 响应式编程 响应式编程,也称为流式编程,对于非前端工程师来说,可能并不是一个陌生的名词,它是函数式编程在软件开发中应用的延伸,如果你对函数式编程还没有 ...

  9. 函数响应式编程(FRP)思想-Callback风格

    序 ReactiveCocoa是IOS广为使用的技术框架,而ReactiveCocoa的核心思想就FRP.FRP不同于JAVA的object-oriented和AOP,FRP能让你的代码像数学一样简洁 ...

随机推荐

  1. NIO初探

    NIO的前世今生 NIO又叫NonBlockingI/O,即非阻塞I/O.以此对应的,有一个更常见的IO(BIO),又叫Blocking I/O,即阻塞IO,两种都为Java的IO实现方案. NIO/ ...

  2. 第一、二章——Python简介与Python基础

    前言:<Data Wrangling with Python>这本书主要是讲使用Pyhon来处理各种类型保存的数据的. 第一章:Python简介 1.版本选择 本书选择的Python版本是 ...

  3. Sqoop使用笔记(转载)

    Sqoop是Apache顶级项目,主要用来在Hadoop和关系数据库中传递数据.通过sqoop,可以方便的将数据从关系数据库导入到HDFS,或将数据从HDFS导出到关系数据库. 关于Sqoop 官网S ...

  4. C# Find()和First()与FirstOrDefault(

    1. Find方法只能在List<T>上使用,而后者能更广泛应用在IEnemerable<T>上. Find最终是建立在Array的查找之上,而在IEnemerable上的Fi ...

  5. 面试:谈谈你对Spring框架的理解

    Spring是一个优秀的轻量级框架,大大的提高了项目的开发管理与维护.Spring有两个核心模块.一个是IOC,一个是AOP. IOC: 就是控制反转的意思,指的是我们将对象的控制权从应用代码本身转移 ...

  6. InnoDB高并发原理

    一.并发控制 为啥要进行并发控制? 并发的任务对同一个临界资源进行操作,如果不采取措施,可能导致不一致,故必须进行并发控制(Concurrency Control). 技术上,通常如何进行并发控制? ...

  7. 【python】如何查看已经安装的python软件包和版本

    pip 是一个安装和管理 Python 包的工具 , 是 easy_install 的一个替换品. pip freeze可以查看已经安装的python软件包和版本 pip list 也可以

  8. BZOJ 1042 硬币购物(背包DP+容斥原理)

    可以看出这是个多重背包,运用单调队列优化可以使每次询问达到O(s).这样总复杂度为O(s*tot). 会TLE. 因为改题的特殊性,每个硬币的币值是不变的,变的只是每次询问的硬币个数. 我们不妨不考虑 ...

  9. BZOJ3997 TJOI2015组合数学(动态规划)

    copy: Dilworth定理:DAG的最小链覆盖=最大点独立集 最小链覆盖指选出最少的链(可以重复)使得每个点都在至少一条链中 最大点独立集指最大的集合使集合中任意两点不可达 此题中独立的定义即是 ...

  10. 完全理解Python的 '==' 和 'is'

    '==' 比较的是两个对象的值 'is' 比较的是两个对象的内存地址(id) 下面我们着重理解 'is'.对于这个,我们需要知道:小整数对象池,大整数对象池,以及intern机制 小整数池:Pytho ...