package com.mcxtzhang.rxjavademo; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import rx.Observable; import rx.Observer; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action0; import rx.functions.Action1; import rx.functions.Func1; import rx.schedulers.Schedulers; public class MainActivity extends AppCompatActivity { private static final String TAG = "RxJava"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Observer<String> observer = new Observer<String>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted() called"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onNext(String s) { Log.d(TAG, "onNext() called with: s = [" + s + "]"); } }; Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onNext(String s) { Log.d(TAG, "Item: " + s); } @Override public void onCompleted() { Log.d(TAG, "Completed!"); } @Override public void onError(Throwable e) { Log.d(TAG, "Error!"); } }; Observable observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello"); subscriber.onNext("Hi"); subscriber.onNext("Aloha"); subscriber.onCompleted(); } }); /** * create() 方法是 RxJava 最基本的创造事件序列的方法。基于这个方法, RxJava 还提供了一些方法用来快捷创建事件队列,例如: just(T...): 将传入的参数依次发送出来。 */ Observable observable2 = Observable.just("Hello", "Hi", "Aloha"); // 将会依次调用: // onNext("Hello"); // onNext("Hi"); // onNext("Aloha"); // onCompleted(); //from(T[]) / from(Iterable<? extends T>) : 将传入的数组或 Iterable 拆分成具体对象后,依次发送出来 String[] words = {"Hello", "Hi", "Aloha"}; Observable observable3 = Observable.from(words); // 将会依次调用: // onNext("Hello"); // onNext("Hi"); // onNext("Aloha"); // onCompleted(); observable3.subscribe(subscriber); /** * a. 打印字符串数组 将字符串数组 names 中的所有字符串依次打印出来: */ String[] names = new String[]{"张旭童", "大童阁", "Android"}; Observable.from(names).subscribe(new Action1<String>() { @Override public void call(String s) { Log.d(TAG, "call() called with: s = [" + s + "]"); } }); /** * b. 由 id 取得图片并显示 由指定的一个 drawable 文件 id drawableRes 取得图片,并显示在 ImageView 中,并在出现异常的时候打印 Toast 报错: */ final ImageView iv = (ImageView) findViewById(R.id.iv); final int drawableResId = R.mipmap.ic_launcher; Observable<Drawable> imgObservable1 = Observable.create(new Observable.OnSubscribe<Drawable>() { @Override public void call(Subscriber<? super Drawable> subscriber) { Drawable drawable = getResources().getDrawable(drawableResId); subscriber.onNext(drawable); subscriber.onCompleted(); } }); imgObservable1.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Drawable>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Toast.makeText(MainActivity.this, "出错了", Toast.LENGTH_SHORT).show(); } @Override public void onNext(Drawable drawable) { iv.setImageDrawable(drawable); } }); //[map]: // 利用变化做上面的demo final ImageView iv2 = (ImageView) findViewById(R.id.iv2); Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { subscriber.onNext(drawableResId); subscriber.onCompleted(); } }).map(new Func1<Integer, Drawable>() { @Override public Drawable call(Integer integer) { return getTheme().getDrawable(integer); } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Drawable>() { @Override public void call(Drawable drawable) { iv2.setImageDrawable(drawable); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { Log.e(TAG, "call: 出错了加载图片出错了"); } }); iv2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.d(TAG, "onClick() called with: view = [" + view + "]"); } }); final Observable<String> throttleFirst = Observable.just("什么鬼") .throttleFirst(500, TimeUnit.MILLISECONDS);//500秒不会重复发出事件; findViewById(android.R.id.content).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { throttleFirst.subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String s) { Log.d(TAG, "防止重复点击吗?call() called with: s = [" + s + "]"); } }); } }); final TextView tv = (TextView) findViewById(R.id.tv); tv.setText("切换前"); findViewById(R.id.iv2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new Thread(new Runnable() { @Override public void run() { Log.d(TAG, "run() called" + Thread.currentThread()); func(); } }).start(); //func(); } public void func() { Log.d(TAG, "func() called" + Thread.currentThread()); Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { Log.d(TAG, "Observable called" + Thread.currentThread()); subscriber.onNext("呵呵哒"); subscriber.onCompleted(); } }) .subscribeOn(Schedulers.computation()) .subscribeOn(AndroidSchedulers.mainThread())//即使重复写 但是以上面那个为准 .doOnSubscribe(new Action0() {//可以设置start所在现成的onStart方法 @Override public void call() { Log.d(TAG, "doOnSubscribe called" + Thread.currentThread()); tv.setText("doOnSubscribe"); } }) // .subscribeOn(Schedulers.io())//改变doOnSubscribe的线程,这离doOnSubscribe这句话最近 // .subscribeOn(AndroidSchedulers.mainThread())//即使重复写 但是以上面那个为准 .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String s) { Log.d(TAG, "subscribe call() called with: s = [" + s + "]" + Thread.currentThread()); } }); } }); Observable.just("On", "Off", "On", "Off") .filter(new Func1<String, Boolean>() { @Override public Boolean call(String s) { return s != null; } }).subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d("DDDDDD", "结束观察...\n"); } @Override public void onError(Throwable e) { //出现错误会调用这个方法 } @Override public void onNext(String s) { //处理事件 Log.d("DDDDD", "handle this---" + s); } }); //※线程切换 看这里 //一个重点是 map内部会保持顺序,而map之间不一定保持顺序 //例如下面 map 1 2 3 ,内部又 5 9 。 //也就是说 只能保证 5 是按 map 1 2 3 顺序走 //不一定保证 51 91 52 92 53 93 的顺序 /** * 12-02 02:54:03.967 9062-9115/com.mcxtzhang.rxjavademo E/RxJava: before onCompleted():Thread[RxIoScheduler-5,5,main] 12-02 02:54:03.967 9062-9062/com.mcxtzhang.rxjavademo E/RxJava: map1: 5 map1, xiancheng:Thread[main,5,main] 12-02 02:54:03.967 9062-9062/com.mcxtzhang.rxjavademo E/RxJava: map1: 9 map1, xiancheng:Thread[main,5,main] 12-02 02:54:03.967 9062-9114/com.mcxtzhang.rxjavademo E/RxJava: map2: 5 map1 map2, xiancheng:Thread[RxIoScheduler-4,5,main] 12-02 02:54:03.968 9062-9062/com.mcxtzhang.rxjavademo E/RxJava: map3: 5 map1 map2 map3, xiancheng:Thread[main,5,main] 12-02 02:54:03.968 9062-9114/com.mcxtzhang.rxjavademo E/RxJava: map2: 9 map1 map2, xiancheng:Thread[RxIoScheduler-4,5,main] 12-02 02:54:03.968 9062-9062/com.mcxtzhang.rxjavademo E/RxJava: map3: 9 map1 map2 map3, xiancheng:Thread[main,5,main] */ findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Subscriber<String> subscriber1 = new Subscriber<String>() { @Override public void onStart() { Log.d(TAG, "onStart() called" + ", xiancheng:" + Thread.currentThread()); } @Override public void onCompleted() { Log.e(TAG, "onCompleted: " + ", xiancheng:" + Thread.currentThread()); } @Override public void onError(Throwable e) { Log.e(TAG, "onError: " + ", xiancheng:" + Thread.currentThread()); } @Override public void onNext(String s) { Log.d(TAG, "onNext() called with: Subscriber = [" + this + "]"); Log.e(TAG, "onNext: " + s + ", xiancheng:" + Thread.currentThread()); } }; Log.d(TAG, "onClick() called with: subscriber1 = [" + subscriber1 + "]"); Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { Log.d(TAG, "call() called with: subscriber = [" + subscriber + "]"); Log.e(TAG, "before onNext(5):" + Thread.currentThread()); subscriber.onNext(5); Log.e(TAG, "before onNext(9):" + Thread.currentThread()); subscriber.onNext(9); Log.e(TAG, "before onCompleted():" + Thread.currentThread()); subscriber.onCompleted(); } }) //这句话改变的应该是Obervable的执行线程 .subscribeOn(Schedulers.io()) //这句话不会改变map的执行线程,也不会改变Observable的执行线程 .subscribeOn(AndroidSchedulers.mainThread()) //改变的临近的一个map Subscriber 的执行线程 .observeOn(AndroidSchedulers.mainThread()) .map(new Func1<Integer, String>() { @Override public String call(Integer integer) { Log.e(TAG, "map1: " + integer + " map1" + ", xiancheng:" + Thread.currentThread()); return integer + " map1"; } }) .observeOn(Schedulers.io()) .map(new Func1<String, String>() { @Override public String call(String s) { Log.e(TAG, "map2: " + s + " map2" + ", xiancheng:" + Thread.currentThread()); return s + " map2"; } }) .observeOn(AndroidSchedulers.mainThread()) .map(new Func1<String, String>() { @Override public String call(String s) { Log.e(TAG, "map3: " + s + " map3" + ", xiancheng:" + Thread.currentThread()); return s + " map3"; } }) /* .subscribeOn(Schedulers.io()) */ .observeOn(Schedulers.io()) .subscribe(subscriber1); } }); findViewById(R.id.btnJust).setOnClickListener(new View.OnClickListener() { String TAG = "zxt"; @Override public void onClick(View v) { Integer[] array1 = new Integer[]{1, 2, 3, 4, 5, 6}; Integer[] array2 = new Integer[]{11, 12, 13, 14, 15, 16}; Observable<Integer[]> observable1 = Observable.just(array1, array2); observable1.subscribe(new Subscriber<Integer[]>() { @Override public void onStart() { super.onStart(); } @Override public void onCompleted() { Log.d(TAG, "onCompleted() called"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onNext(Integer[] integers) { Log.d(TAG, "onNext() called with: integers = [" + integers + "]"); } }); } }); findViewById(R.id.btnInterval).setOnClickListener(new View.OnClickListener() { String TAG = "zxt"; @Override public void onClick(View v) { //定时器的just 没有任何卵用,他只是timer的作用。 我也不太清楚要如何停止 才不会内存泄漏 Observable.just(1, 2, 3, 4) .interval(3, 3, TimeUnit.SECONDS). subscribe(new Action1<Long>() { @Override public void call(Long aLong) { Log.d(TAG, "call() called with: aLong = [" + aLong + "]"); } }); } }); findViewById(R.id.btnRange).setOnClickListener(new View.OnClickListener() { String TAG = "zxt"; @Override public void onClick(View v) { //从5 开始,数10个,即5-14 Observable.range(5, 10).subscribe(new Subscriber<Integer>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted() called"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onNext(Integer integer) { Log.d(TAG, "onNext() called with: integer = [" + integer + "]"); } }); } }); findViewById(R.id.btnFilter).setOnClickListener(new View.OnClickListener() { String TAG = "zxt"; @Override public void onClick(View v) { Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { if (!subscriber.isUnsubscribed()) { subscriber.onNext(1); subscriber.onNext(50); subscriber.onNext(25); subscriber.onCompleted(); } } }).filter(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { return (integer & 1) == 0; } }).subscribe(new Subscriber<Integer>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted() called"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onNext(Integer integer) { Log.d(TAG, "onNext() called with: integer = [" + integer + "]"); } }); } }); //flatMap Demo findViewById(R.id.btnFlatMap).setOnClickListener(new View.OnClickListener() { String TAG = "zxt"; @Override public void onClick(View view) { //flatmap使用: List<Student> students = new ArrayList<>(); students.add(new Student()); students.add(new Student()); students.add(new Student()); students.add(new Student()); students.add(new Student()); Subscriber<Course> courseSubscriber = new Subscriber<Course>() { @Override public void onCompleted() { Log.d(TAG, "course onCompleted() called"); } @Override public void onError(Throwable e) { Log.d(TAG, "course onError() called with: e = [" + e + "]"); } @Override public void onNext(Course course) { Log.d(TAG, "onNext() called with: course = [" + course.getScroe() + "]"); } }; Observable.from(students).flatMap(new Func1<Student, Observable<Course>>() { @Override public Observable<Course> call(Student student) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return Observable.from(student.getCourse()); } }).subscribeOn(Schedulers.io())//加上这句话 Observable的动作都在io线程里 .observeOn(AndroidSchedulers.mainThread()) .subscribe(courseSubscriber); } }); //doOnSubscribe 实例: findViewById(R.id.btndoOnSubscribe).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { if (!subscriber.isUnsubscribed()) { Log.d(TAG, "subscriber.onNext(\"测试\");" + ", xiancheng:" + Thread.currentThread()); subscriber.onNext("测试"); subscriber.onCompleted(); } } }) .subscribeOn(Schedulers.computation()) .doOnSubscribe(new Action0() { @Override public void call() { Log.d(TAG, "doOnSubscribe" + ", xiancheng:" + Thread.currentThread()); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) .subscribe(new Subscriber<String>() { @Override public void onStart() { Log.d(TAG, "onStart() called" + Thread.currentThread()); super.onStart(); } @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { } }); } }); findViewById(R.id.btnLoop).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mTestLeak = new Subscriber<String>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted() called"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onNext(String s) { Log.d(TAG, "onNext() called with: s = [" + s + "]"); } }; Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { int i = 0; while (true) { Log.d(TAG, "call() called with: i = [" + i + "]"); subscriber.onNext(i++ + ""); } } }).subscribe(mTestLeak); } }); findViewById(R.id.btnStop).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mTestLeak.unsubscribe(); } }); } private Subscriber mTestLeak; }