学了一段时间android,看了部分的项目代码,然后想想老是学基础也够枯燥乏味的,那么就来学习学习新东西吧,相信很多学java的都听说过RxJava,那么android下也有RxAndroid。

RxJava最核心的两个东西是Observables(被观察者,事件源)和Subscribers(订阅者)。Observables发出一系列事件,Subscribers处理这些事件。这里的事件可以是任何你感兴趣的东西,触摸事件,web接口调用返回的数据等等。

关于RxAndroid的github:https://github.com/ReactiveX/RxAndroid

新建emRxAndroidStudy工程, 然后在build.grade的dependencies里添加:

  1. compile 'io.reactivex:rxandroid:1.1.0'
  2. compile 'io.reactivex:rxjava:1.1.0'

接着我们来试下RxAndroid了, 首先这里我们还是使用上次的注解的方式,把4个和Annotation相关的文件拷贝到工程,编写MainActivity代码如下:

  1. package com.jared.emrxandroidstudy;
  2.  
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.TextView;
  8.  
  9. import rx.Observable;
  10. import rx.Subscriber;
  11.  
  12. @EMLayoutBinder(R.layout.activity_main)
  13. public class MainActivity extends BaseActivity {
  14.  
  15. private static final String TAG = "MainActivity";
  16. private Subscriber<String> subscriber;
  17. private Observable<String> observable;
  18.  
  19. @EMViewBinder(R.id.hello)
  20. private TextView mHello;
  21. @EMViewBinder(R.id.test1)
  22. private Button mTest1;
  23.  
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. createSubscriber();
  28. }
  29.  
  30. private void bindSubscriber() {
  31. observable.subscribe(subscriber);
  32. }
  33.  
  34. private void createSubscriber() {
  35.  
  36. subscriber = new Subscriber<String>() {
  37.  
  38. @Override
  39. public void onCompleted() {
  40. Log.d(TAG, "onCompleted");
  41. }
  42.  
  43. @Override
  44. public void onError(Throwable e) {
  45. e.printStackTrace();
  46. }
  47.  
  48. @Override
  49. public void onNext(String t) {
  50. Log.d(TAG, "onNext");
  51. mHello.setText(t);
  52. }
  53. };
  54. }
  55.  
  56. private String getHello() {
  57. return "Hello RxAndroid";
  58. }
  59.  
  60. private String getHello1() {
  61. return "Hello RxAndroid 1";
  62. }
  63.  
  64. @EMOnClickBinder({R.id.test1})
  65. public void myOnClick(View view) {
  66. switch (view.getId()) {
  67. case R.id.test1:
  68. createObservable();
  69. break;
  70. default:
  71. break;
  72. }
  73. }
  74.  
  75. private void createObservable() {
  76. Log.d(TAG, "observable");
  77. observable = Observable.create(new Observable.OnSubscribe<String>() {
  78. @Override
  79. public void call(Subscriber<? super String> subscriber) {
  80. subscriber.onNext(getHello());
  81. subscriber.onCompleted();
  82. }
  83. });
  84. bindSubscriber();
  85. }
  86. }

布局文件如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context="com.jared.emrxandroidstudy.MainActivity">
  9.  
  10. <TextView
  11. android:id="@+id/hello"
  12. android:text="Hello World!"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content" />
  15.  
  16. <Button
  17. android:id="@+id/test1"
  18. android:text="Test"
  19. android:layout_width="match_parent"
  20. android:layout_height="wrap_content"
  21. android:textAllCaps="false"/>
  22. </LinearLayout>

这里创建了Observable,用来发送一字符串,然后创建了Subscriber,用来接收事件处理,然后把这两个绑定,按下按钮后,subscriber会调用onNext方法和onCompleted方法。

当然这里的createObservable可以通过just方法简化:

  1. private void createObservableByJust() {
  2. Log.d(TAG, "createObservable");
  3. observable = Observable.just(getHello());
  4. bindSubscriber();
  5. }

效果和上述的是一样一样的。接着简化subscriber了:

  1. private void createSubscriberByAction() {
  2. onNextAction = new Action1<String>() {
  3. @Override
  4. public void call(String s) {
  5. mHello.setText(s);
  6. }
  7. };
  8. }

这里通过Action1来实现,完全没有了subscriber了的感觉,接着修改绑定如下:

  1. private void bindSubscriber() {
  2. //observable.subscribe(subscriber);
  3. observable.subscribe(onNextAction);
  4. }

效果还是一样一样的。

好了,接着我们来使用下操作符map,修改如下:

  1. private void createObservableByMap() {
  2. Log.d(TAG, "createObservableByMap");
  3. Observable.just(getHello()).map(new Func1<String, String>() {
  4. @Override
  5. public String call(String s) {
  6. return s + " by eastmoon";
  7. }
  8. }).subscribe(onNextAction);
  9. }

运行结果后原来字符串加上了by eastmoon了。其实map的功能就是在observable和subscribe之间可以对数据进行操作。

Android开发学习之路--RxAndroid之初体验的更多相关文章

  1. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  2. Android开发学习之路--React-Native之初体验

      近段时间业余在学node.js,租了个阿里云准备搭建后端,想用node.js,偶尔得知react-native可以在不同平台跑,js在iOS和android上都可以运行ok,今天就简单学习下rea ...

  3. Android开发学习之路--Service之初体验

    android最后一个组件便是service了,终于学习到最后一个组件了,从年前的开发环境的搭建,到现在学到最后一个组件花了三周的时间,期间记录的点点滴滴,照着书本学习编写的代码都受益匪浅,这里要感谢 ...

  4. Android开发学习之路--传感器之初体验

    说到传感器,还是有很多的,有加速度啊,光照啊,磁传感器等等.当然android手机之所以称为智能手机,少不了这几款传感器的功劳了.下面就学习下了,这里主要学习光照,加速度和磁. 新建工程emSenso ...

  5. Android开发学习之路--Camera之初体验

    顾名思义Camera就是拍照和录像的功能,像微信里面,我们想拍照传一下照片,就可以通过camera来拍照,然后存储照片,发送给好友.那么微信的app里面是不会直接通过camera api来实现的,因为 ...

  6. Android开发学习之路--UI之初体验

    之前都是学习Activity,对于布局都没有做过学习,这里就简单学习下吧.下面看下Android Studio下有哪些控件: 这里分为Widgets,Text Fields,Containers,Da ...

  7. Android开发学习之路--Notification之初体验

    一般当我们收到短信啊,微信啊,或者有些app的提醒,我们都会在通知栏收到一天简单的消息,然后点击消息进入到app里面,其实android中有专门的Notification的类可以完成这个工作,这里就实 ...

  8. Android开发学习之路--RxAndroid之简单原理

      学习了RxAndroid,其实也就是RxJava了,但是还是不是非常清楚到底RxAndroid有什么用呢?为什么要使用RxAndroid呢?这篇文章讲得不错,RxJava的原理.但是这里还是把整个 ...

  9. Android开发学习之路--RxAndroid之lambda

      RxJava的简单使用基本上也了解了,其实还有一个比较好玩的就是java8才有的lambda了. lambda在android studio下的环境搭建 下载java8   下面就来搭建下这个环境 ...

随机推荐

  1. hdu 5641 BestCoder Round #75

    King's Phone  Accepts: 310  Submissions: 2980  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: ...

  2. [BZOJ]4650 优秀的拆分(Noi2016)

    比较有意思的一道后缀数组题.(小C最近是和后缀数组淦上了?) 放在NOI的考场上.O(n^3)暴力80分,O(n^2)暴力95分…… 即使想把它作为一道签到题也不要这么随便啊摔(╯‵□′)╯︵┻━┻ ...

  3. Thread类中的静态方法

    1.currentThread() currentThread()方法返回的是对当前正在执行线程对象的引用. package thread; /** * 线程类的构造方法.静态块是被main线程调用的 ...

  4. Python开发——利用正则表达式实现计算器算法

    Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...

  5. linux 删除命令

    rm *    文件名rm -r */ 文件夹rm -rf * 文件夹或文件名 -r 代表文件夹之下的都删除掉 -f 代表暴力删除,无需确认直接删完

  6. bootstrap插件fileinput.js 出现出现$("#xxxx").fileinput({}); 不生效的情况解决

    如果出现$("#xxxx").fileinput({}); 不生效的情况请将fileinput.js中最后几行注释掉: /* $(document).ready(function ...

  7. brew的MAC安装

    1.介绍 brew是一个软件包管理工具,类似于centos下的yum或者ubuntu下的apt-get,非常方便,免去了自己手动编译安装的不便 brew 安装目录 /usr/local/Cellar ...

  8. find函数用法详解

    语法:find (string, sub3tring<, modifiers, startpos>),返回substring首次在string中出现的位置,若未找到,则返回0.其中:mod ...

  9. PTA中如何出Java题目?

    PTA中如何出Java题目? 很多第一次出题的老师,不知道Java在PTA中是如何处理输入的.写一篇文章供大家参考.比如以下这样的一个题目: 从控制台读入两个数,然后将其相加输出. 对于该题可以有如下 ...

  10. 高仿腾讯QQ最终版

    之前写过一篇关于高仿腾讯QQ的博客,不知道的看这:http://blog.csdn.net/htq__/article/details/51840273 ,主要是从界面上高仿了腾讯QQ,在UI上基本上 ...