Rxjava的简单使用

来源:互联网 发布:java 队列 线程安全 编辑:程序博客网 时间:2024/05/21 07:09

布局文件

//activity_main

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.think.rxjava.MainActivity">


    <Button
        android:id="@+id/btn1"
        android:text="demo1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/btn2"
        android:text="demo2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/btn3"
        android:text="Backpressure问题"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>


//activity_rx_demo1

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.think.rxjava.RxJavaDemo1Activity">


    <Button
        android:id="@+id/btn_send1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送1" />


    <Button
        android:id="@+id/btn_send2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="链式发送" />
    <Button
        android:id="@+id/btn_send3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送中切断水管" />
    <Button
        android:id="@+id/btn_send4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送只处理onNext事件" />
    <Button
        android:id="@+id/btn_send5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Observable的其他操作" />
    <Button
        android:id="@+id/btn_send6"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="rxjava的操作符使用" />


</LinearLayout>


//activity_rx_demo2

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.think.rxjava.RxJavaDemo2Activity">


    <Button
        android:id="@+id/btn"
        android:text="线程操作!"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />


</LinearLayout>

//activity_rx_demo3


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.think.rxjava.RxJavaDemo3Activity">


    <Button
        android:id="@+id/btn_backpressure"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Flowable的理解使用!" />


</LinearLayout>


主文件代码文件

public class MainActivity extends AppCompatActivity implements View.OnClickListener {


    protected Button btn1;
    protected Button btn2;
    protected Button btn3;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_main);
        initView();
    }


    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.btn1) {
            startActivity(new Intent(this, RxJavaDemo1Activity.class));
        } else if (view.getId() == R.id.btn2) {
            startActivity(new Intent(this, RxJavaDemo2Activity.class));
        } else if (view.getId() == R.id.btn3) {
            startActivity(new Intent(this, RxJavaDemo3Activity.class));
        }
    }


    private void initView() {
        btn1 = (Button) findViewById(R.id.btn1);
        btn1.setOnClickListener(MainActivity.this);
        btn2 = (Button) findViewById(R.id.btn2);
        btn2.setOnClickListener(MainActivity.this);
        btn3 = (Button) findViewById(R.id.btn3);
        btn3.setOnClickListener(MainActivity.this);
    }
}


//GetBitmapForURL 

public class GetBitmapForURL {


    public static Bitmap getBitmap(String url) {
        //获取传进来的参数
        Bitmap bitmap = null;
        URLConnection connection;
        InputStream is;
        BufferedInputStream bis;
        try {
            connection = new URL(url).openConnection();
            is = connection.getInputStream();
            //为了更清楚的看到加载图片的等待操作,将线程休眠2秒钟
            Thread.sleep(2000);
            bis = new BufferedInputStream(is);
            //通过decodeStream方法解析输入流
            bitmap = BitmapFactory.decodeStream(bis);
            is.close();
            bis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }
}

//  MyObserver

/**
 * Created by think on 2017/11/29.
 */


public class MyObserver implements Observer {
    @Override
    public void onSubscribe(Disposable d) {


    }


    @Override
    public void onNext(Object o) {


    }


    @Override
    public void onError(Throwable e) {


    }


    @Override
    public void onComplete() {


    }
}


//文件RxJavaDemo1Activity

public class RxJavaDemo1Activity extends AppCompatActivity implements View.OnClickListener {


    protected Button btnSend1;
    protected Button btnSend2;
    protected Button btnSend3;
    protected Button btnSend4;
    protected Button btnSend5;
    protected Button btnSend6;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_rx_java_demo1);
        initView();
    }


    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.btn_send1) {
            test1();//普通使用
        } else if (view.getId() == R.id.btn_send2) {
            test2();//链式调用
        } else if (view.getId() == R.id.btn_send3) {
            test3();//发送中,中断.
        } else if (view.getId() == R.id.btn_send4) {
            test4();//只关心onnext事件的操作
        } else if (view.getId() == R.id.btn_send5) {
            test5();//几种被观察者的创建方式
        } else if (view.getId() == R.id.btn_send6) {
            test6();//常用的操作符
        }
    }


    private void test6() {
        DialogUtil.showListDialog(this, "rxjava的操作符号使用", new String[]{
                "0map()操作符",
                "1flatMap()操作符",
                "2filter()操作符",
                "3take()操作符",
                "4doOnNext()操作符",
        }, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case 0:
                        map0();
                        break;
                    case 1:
                        map1();
                        break;
                    case 2:
                        map2();
                        break;
                    case 3:
                        map3();
                        break;
                    case 4:
                        map4();
                        break;
                }
            }
        });
    }


    private void map4() {
        Observable.just(new ArrayList<String>(){
            {
                for (int i = 0; i < 6; i++) {
                    add("data"+i);
                }
            }
        }).flatMap(new Function<List<String>, ObservableSource<?>>() {
            @Override
            public ObservableSource<?> apply(List<String> strings) throws Exception {
                return Observable.fromIterable(strings);
            }
        }).take(5).doOnNext(new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {
                DemonstrateUtil.showLogResult("额外的准备工作!");
            }
        }).subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object s) throws Exception {
                DemonstrateUtil.showLogResult(s.toString());
            }
        });
    }


    private void map3() {
        Observable.just(new ArrayList<String>(){
            {
                for (int i = 0; i < 8; i++) {
                    add("data"+i);
                }
            }
        }).flatMap(new Function<List<String>, ObservableSource<?>>() {
            @Override
            public ObservableSource<?> apply(List<String> strings) throws Exception {
                return Observable.fromIterable(strings);
            }
        }).take(10).subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object s) throws Exception {
                DemonstrateUtil.showLogResult(s.toString());
            }
        });
    }


    private void map2() {
        Observable
                .just(new ArrayList<String>(){
                    {
                        for (int i = 0; i < 5; i++) {
                            add("data"+i);
                        }
                    }
                })
                .flatMap(new Function<List<String>, ObservableSource<?>>() {
                    @Override
                    public ObservableSource<?> apply(List<String> strings) throws Exception {
                        return Observable.fromIterable(strings);
                    }
                }).filter(new Predicate<Object>() {
            @Override
            public boolean test(Object s) throws Exception {
                String newStr = (String) s;
                if (newStr.contains("3")){
                    return true;
                }
                return false;
            }
        }).subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {
                DemonstrateUtil.showLogResult((String)o);
            }
        });
    }


    private void map1() {
        Observable.just(new ArrayList<String>(){
            {
                for (int i = 0; i < 3; i++) {
                    add("data"+i);
                }
            }
        }).flatMap(new Function<List<String>, ObservableSource<?>>() {
            @Override
            public ObservableSource<?> apply(List<String> strings) throws Exception {
                return Observable.fromIterable(strings);
            }
        }).subscribe(new Observer<Object>() {
            @Override
            public void onSubscribe(Disposable d) {


            }


            @Override
            public void onNext(Object o) {
                DemonstrateUtil.showLogResult("flatMap转换后,接收到的"+o);
            }


            @Override
            public void onError(Throwable e) {


            }


            @Override
            public void onComplete() {


            }
        });
    }


    private void map0() {
        Observable.just("hellorxjava")
                .map(new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) throws Exception {
                        return s.length();
                    }
                }).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {


            }


            @Override
            public void onNext(Integer integer) {
                DemonstrateUtil.showLogResult("接收到被转换的数据结果:"+integer);
            }


            @Override
            public void onError(Throwable e) {


            }


            @Override
            public void onComplete() {


            }
        });
    }


    private void test5() {
        DialogUtil.showListDialog(this, "rxjava的其他操作", new String[]{
                "0just()方式创建Observable",
                "1fromIterable()方式创建Observable",
                "2defer()方式创建Observable",
                "3interval( )方式创建Observable",
                "4timer( )方式创建Observable",
                "5range( )方式创建Observable",
                "6repeat( )方式创建Observable",
        }, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case 0:
                        other0();
                        break;
                    case 1:
                        other1();
                        break;
                    case 2:
                        other2();
                        break;
                    case 3:
                        other3();
                        break;
                    case 4:
                        other4();
                        break;
                    case 5:
                        other5();
                        break;
                    case 6:
                        other6();
                        break;
                }
            }
        });
    }


    private void other6() {
        Observable.just(123).repeat().subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {


            }


            @Override
            public void onNext(Integer integer) {
                DemonstrateUtil.showLogResult("重复integer" + integer);
            }


            @Override
            public void onError(Throwable e) {


            }


            @Override
            public void onComplete() {


            }
        });
    }


    private void other5() {
        Observable.range(1, 5).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {


            }


            @Override
            public void onNext(Integer integer) {
                DemonstrateUtil.showLogResult("连续收到:" + integer);
            }


            @Override
            public void onError(Throwable e) {


            }


            @Override
            public void onComplete() {


            }
        });
    }


    private void other4() {
        Observable.timer(5, TimeUnit.SECONDS).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {


            }


            @Override
            public void onNext(Long aLong) {
                DemonstrateUtil.showLogResult("延迟5s后调用了:onNext");
            }


            @Override
            public void onError(Throwable e) {


            }


            @Override
            public void onComplete() {


            }
        });
    }


    private void other3() {
        Observable.interval(3, TimeUnit.SECONDS).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {


            }


            @Override
            public void onNext(Long aLong) {
                DemonstrateUtil.showLogResult("数字是:" + aLong);
                //DemonstrateUtil.showToastResult(RxJavaDemo1Activity.this,"数字是:"+aLong);
            }


            @Override
            public void onError(Throwable e) {


            }


            @Override
            public void onComplete() {


            }
        });
    }


    private void other2() {
        Observable<String> observable = Observable.defer(new Callable<ObservableSource<? extends String>>() {
            @Override
            public ObservableSource<? extends String> call() throws Exception {
                return Observable.just("hello,defer");
            }
        });


        //上游衔接下游!
        observable.subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {


            }


            @Override
            public void onNext(String s) {
                DemonstrateUtil.showLogResult(s);
                DemonstrateUtil.showToastResult(RxJavaDemo1Activity.this, s);
            }


            @Override
            public void onError(Throwable e) {


            }


            @Override
            public void onComplete() {


            }
        });
    }


    private void other1() {
        Observable.fromIterable(new ArrayList<String>() {
            {
                for (int i = 0; i < 5; i++) {
                    add("Hello," + i);
                }
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {


            }


            @Override
            public void onNext(String s) {
                DemonstrateUtil.showToastResult(RxJavaDemo1Activity.this, s);
                DemonstrateUtil.showLogResult(s);
            }


            @Override
            public void onError(Throwable e) {


            }


            @Override
            public void onComplete() {


            }
        });
    }


    private void other0() {
        Observable.just("hello,you hao!").subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {


            }


            @Override
            public void onNext(String s) {
                DemonstrateUtil.showLogResult(s);
                DemonstrateUtil.showToastResult(RxJavaDemo1Activity.this, s);
            }


            @Override
            public void onError(Throwable e) {


            }


            @Override
            public void onComplete() {


            }
        });
    }


    private void test4() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                DemonstrateUtil.showLogResult("emitter 1");
                emitter.onNext(1);


                DemonstrateUtil.showLogResult("emitter 2");
                emitter.onNext(2);


                DemonstrateUtil.showLogResult("emitter 3");
                emitter.onNext(3);


                DemonstrateUtil.showLogResult("complete");
                emitter.onComplete();


                DemonstrateUtil.showLogResult("emitter 4");
                emitter.onNext(4);
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                DemonstrateUtil.showLogResult("accept:" + integer);
            }
        });
    }


    private void test3() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                DemonstrateUtil.showLogResult("emitter 1");
                emitter.onNext(1);


                DemonstrateUtil.showLogResult("emitter 2");
                emitter.onNext(2);


                DemonstrateUtil.showLogResult("emitter 3");
                emitter.onNext(3);


                DemonstrateUtil.showLogResult("complete");
                emitter.onComplete();


                DemonstrateUtil.showLogResult("emitter 4");
                emitter.onNext(4);
            }
        }).subscribe(new Observer<Integer>() {
            private Disposable mDisposable;
            private int i;


            @Override
            public void onSubscribe(Disposable d) {
                DemonstrateUtil.showLogResult("subscribe");
                mDisposable = d;
            }


            @Override
            public void onNext(Integer value) {
                DemonstrateUtil.showLogResult("onNext:" + value);
                i++;
                if (i == 2) {
                    DemonstrateUtil.showLogResult("dispose:" + value);
                    mDisposable.dispose();
                    DemonstrateUtil.showLogResult("isDisposed : " + mDisposable.isDisposed());
                }
            }


            @Override
            public void onError(Throwable e) {
                DemonstrateUtil.showLogResult("error:");
            }


            @Override
            public void onComplete() {
                DemonstrateUtil.showLogResult("complete");
            }
        });


    }


    private void test2() {
        //链式调用
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
            }
        }).subscribe(new Observer<Integer>() {


            @Override
            public void onSubscribe(Disposable d) {
                DemonstrateUtil.showLogResult("onSubscribe");
            }


            @Override
            public void onNext(Integer integer) {
                DemonstrateUtil.showLogResult("onNext-->integer" + integer);
            }


            @Override
            public void onError(Throwable e) {
                DemonstrateUtil.showLogResult("onError");
            }


            @Override
            public void onComplete() {
                DemonstrateUtil.showLogResult("onComplete");
            }
        });
    }


    private void test1() {


        //创建上游,数据发射源!
        //ObservableOnSubscribe对象作为参数,它的作用相当于一个计划表,当 Observable被订阅的时候,
        // ObservableOnSubscribe的subscribe()方法会自动被调用,事件序列就会依照设定依次触发
        //ObservableEmitter,发射器,触发事件.
        Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {


            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
            }
        });


        //创建下游,数据接收处!
        Observer<Integer> observer = new Observer<Integer>() {


            @Override
            public void onSubscribe(Disposable d) {
                DemonstrateUtil.showLogResult("onSubscribe");
            }


            @Override
            public void onNext(Integer integer) {
                DemonstrateUtil.showLogResult("onNext--integer" + integer);
            }


            @Override
            public void onError(Throwable e) {
                DemonstrateUtil.showLogResult("onError");
            }


            @Override
            public void onComplete() {
                DemonstrateUtil.showLogResult("onComplete");
            }
        };


        //数据源连接接收处,上游衔接下游!
        //只有当上游和下游建立连接之后, 上游才会开始发送事件
        observable.subscribe(observer);
    }


    private void initView() {
        btnSend1 = (Button) findViewById(R.id.btn_send1);
        btnSend1.setOnClickListener(RxJavaDemo1Activity.this);
        btnSend2 = (Button) findViewById(R.id.btn_send2);
        btnSend2.setOnClickListener(RxJavaDemo1Activity.this);
        btnSend3 = (Button) findViewById(R.id.btn_send3);
        btnSend3.setOnClickListener(RxJavaDemo1Activity.this);
        btnSend4 = (Button) findViewById(R.id.btn_send4);
        btnSend4.setOnClickListener(RxJavaDemo1Activity.this);
        btnSend5 = (Button) findViewById(R.id.btn_send5);
        btnSend5.setOnClickListener(RxJavaDemo1Activity.this);
        btnSend6 = (Button) findViewById(R.id.btn_send6);
        btnSend6.setOnClickListener(RxJavaDemo1Activity.this);
    }
}


//文件RxJavaDemo2Activity

public class RxJavaDemo2Activity extends AppCompatActivity implements View.OnClickListener {


    protected Button btn;
    protected ImageView iv;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_rx_java_demo2);
        initView();
    }


    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.btn) {
            DialogUtil.showListDialog(this, "rxJava操作!", new String[]{
                    "0发送事件io线程并变换主线程接收",
                    "1子线程发送事件主线程接收",
                    "2默认线程发送事件默认线程接收",
            }, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    switch (which) {
                        case 0:
                            show0();
                            break;
                        case 1:
                            show1();
                            break;
                        case 2:
                            show2();
                            break;
                    }
                }
            });
        }
    }


    private void show2() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                DemonstrateUtil.showLogResult("发送的线程名称:" + Thread.currentThread().getName());
                DemonstrateUtil.showLogResult("发送的线程id:" + Thread.currentThread().getId());


                DemonstrateUtil.showLogResult("发送的数据:" + 1);
                e.onNext(1);
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                DemonstrateUtil.showLogResult("接收的线程:" + Thread.currentThread().getName());
                DemonstrateUtil.showLogResult("接收的线程id:" + Thread.currentThread().getId());
                DemonstrateUtil.showLogResult("接收到的数据:-integer:" + integer);
            }
        });
    }


    private void show1() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                DemonstrateUtil.showLogResult("发送的线程名称:" + Thread.currentThread().getName());
                DemonstrateUtil.showLogResult("发送的线程id:" + Thread.currentThread().getId());


                DemonstrateUtil.showLogResult("发送的数据:" + 1);
                e.onNext(1);
            }
        }).subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        DemonstrateUtil.showLogResult("接收的线程:" + Thread.currentThread().getName());
                        DemonstrateUtil.showLogResult("接收的线程id:" + Thread.currentThread().getId());
                        DemonstrateUtil.showLogResult("接收到的数据:-integer:" + integer);
                    }
                });
    }


    private void show0() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                DemonstrateUtil.showLogResult("所在的线程:", Thread.currentThread().getName());
                DemonstrateUtil.showLogResult("发送的数据:", 1 + "");
                e.onNext(1);
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        DemonstrateUtil.showLogResult("所在的线程:", Thread.currentThread().getName());
                        DemonstrateUtil.showLogResult("接收到的数据:", "integer:" + integer);
                    }
                });
    }


    private void initView() {
        btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(RxJavaDemo2Activity.this);
        iv = (ImageView) findViewById(R.id.iv);
    }
}


//文件RxJavaDemo3Activity

public class RxJavaDemo3Activity extends AppCompatActivity implements View.OnClickListener {


    protected Button btnBackpressure;
    private Flowable mFlowable;
    private Subscriber mSubscriber;
    private Subscription mSubscription;
    private Flowable flowableLATEST;
    private Subscriber subscriberLatest;
    private Subscription subscriptionLatest;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_rx_java_demo3);
        initView();
        init4();
        init6();
    }


    private void init6() {
        flowableLATEST = Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> emitter) throws Exception {


                for (int i = 1; i<=200; i++) {
                    emitter.onNext(i);
                    DemonstrateUtil.showLogResult("LATEST生产onNext:"+i);
                }
            }
        }, BackpressureStrategy.LATEST);


        //mSubscription = s;
        subscriberLatest = new Subscriber<Integer>() {
            @Override
            public void onSubscribe(Subscription s) {
                subscriptionLatest = s;
                s.request(100);
            }


            @Override
            public void onNext(Integer integer) {
                DemonstrateUtil.showLogResult("Latest消费onNext:" + integer);
            }


            @Override
            public void onError(Throwable t) {
                DemonstrateUtil.showLogResult("onError");
                DemonstrateUtil.showLogResult(t.getMessage());
                DemonstrateUtil.showLogResult(t.toString());
            }


            @Override
            public void onComplete() {
                DemonstrateUtil.showLogResult("onComplete");
            }
        };
    }


    private void init4() {
        mFlowable = Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> emitter) throws Exception {


                for (int i = 1; i <= 200; i++) {
                    emitter.onNext(i);
                    DemonstrateUtil.showLogResult("生产onNext:"+i);
                }
            }
        }, BackpressureStrategy.DROP);


        //mSubscription = s;
        mSubscriber = new Subscriber<Integer>() {
            @Override
            public void onSubscribe(Subscription s) {
                mSubscription = s;
                s.request(100);
            }


            @Override
            public void onNext(Integer integer) {
                DemonstrateUtil.showLogResult("消费onNext:" + integer);
            }


            @Override
            public void onError(Throwable t) {
                DemonstrateUtil.showLogResult("onError");
                DemonstrateUtil.showLogResult(t.getMessage());
                DemonstrateUtil.showLogResult(t.toString());
            }


            @Override
            public void onComplete() {
                DemonstrateUtil.showLogResult("onComplete");
            }
        };


    }




    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.btn_backpressure) {
            DialogUtil.showListDialog(this, "Flowable的理解使用", new String[]{
                    "0事件堆积现象",
                    "1正常使用策略ERROR!",
                    "2使用策略ERROR出现的异常!",
                    "3使用策略BUFFER,更大的缓存池",
                    "4使用策略DROP,事件关联100",
                    "5使用策略DROP,再申请100",
                    "6使用策略LATEST,事件关联100",
                    "7使用策略LATEST,再申请100",
                    "8使用策略MISSING",
            }, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    switch (which) {
                        case 0:
                            show0();
                            break;
                        case 1:
                            show1();
                            break;
                        case 2:
                            show2();
                            break;
                        case 3:
                            show3();
                            break;
                        case 4:
                            show4();
                            break;
                        case 5:
                            show5();
                            break;
                        case 6:
                            show6();
                            break;
                        case 7:
                            show7();
                            break;
                        case 8:
                            show8();
                            break;
                    }
                }
            });
        }
    }


    private void show8() {
        Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> emitter) throws Exception {
                for (int i = 0; i < 200; i++) {
                    DemonstrateUtil.showLogResult("MISSING-生成emitter" + i);
                    emitter.onNext(i);
                }
            }
        }, BackpressureStrategy.MISSING).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onSubscribe(Subscription s) {
                        //mSubscription = s;
                        //s.request(0);
                    }


                    @Override
                    public void onNext(Integer integer) {
                        DemonstrateUtil.showLogResult("MISSING-消费onNext" + integer);
                    }


                    @Override
                    public void onError(Throwable t) {
                        DemonstrateUtil.showLogResult("onError" + t.getMessage());
                        DemonstrateUtil.showLogResult("onError" + t.toString());
                        t.printStackTrace();
                    }


                    @Override
                    public void onComplete() {
                        DemonstrateUtil.showLogResult("onComplete");
                    }
                });
    }


    private void show7() {
        subscriptionLatest.request(100);
    }


    private void show6() {
        flowableLATEST.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriberLatest);
    }


    private void show5() {
        //128-100-100=  -72.
        mSubscription.request(100);
    }


    private void show4() {
        mFlowable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(mSubscriber);
    }




    private void show3() {
        Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> emitter) throws Exception {
                for (int i = 0; i < 200; i++) {
                    DemonstrateUtil.showLogResult("emitter" + i);
                    emitter.onNext(i);
                }
            }
        }, BackpressureStrategy.BUFFER).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onSubscribe(Subscription s) {
                        //mSubscription = s;
                        //s.request(0);
                    }


                    @Override
                    public void onNext(Integer integer) {
                        DemonstrateUtil.showLogResult("onNext" + integer);
                    }


                    @Override
                    public void onError(Throwable t) {
                        DemonstrateUtil.showLogResult("onError" + t.getMessage());
                        DemonstrateUtil.showLogResult("onError" + t.toString());
                        t.printStackTrace();
                    }


                    @Override
                    public void onComplete() {
                        DemonstrateUtil.showLogResult("onComplete");
                    }
                });
    }


    private void show2() {
        Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> emitter) throws Exception {
                for (int i = 0; i < 200; i++) {
                    DemonstrateUtil.showLogResult("emitter" + i);
                    emitter.onNext(i);
                }
            }
        }, BackpressureStrategy.ERROR).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onSubscribe(Subscription s) {
                        //mSubscription = s;
                        //s.request(0);
                    }


                    @Override
                    public void onNext(Integer integer) {
                        DemonstrateUtil.showLogResult("onNext" + integer);
                    }


                    @Override
                    public void onError(Throwable t) {
                        DemonstrateUtil.showLogResult("onError" + t.getMessage());
                        DemonstrateUtil.showLogResult("onError" + t.toString());
                        t.printStackTrace();
                    }


                    @Override
                    public void onComplete() {
                        DemonstrateUtil.showLogResult("onComplete");
                    }
                });
    }


    private void show1() {
        Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> emitter) throws Exception {
                for (int i = 0; i < 127; i++) {//128---   0--->126
                    DemonstrateUtil.showLogResult("emitter " + i);
                    emitter.onNext(i);
                }
                DemonstrateUtil.showLogResult("emitter complete");
                emitter.onComplete();
            }
        }, BackpressureStrategy.ERROR) //增加了一个参数,设置处理策略.
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onSubscribe(Subscription s) {
                        DemonstrateUtil.showLogResult("onSubscribe");
                        //用来向生产者申请可以消费的事件数量,这样我们便可以根据本身的消费能力进行消费事件.
                        s.request(Long.MAX_VALUE);
                    }


                    @Override
                    public void onNext(Integer integer) {
                        DemonstrateUtil.showLogResult("onNext: " + integer);
                    }


                    @Override
                    public void onError(Throwable t) {
                        DemonstrateUtil.showLogResult("onError: " + t.getMessage());
                        DemonstrateUtil.showLogResult("onError: " + t.toString());
                        t.printStackTrace();
                    }


                    @Override
                    public void onComplete() {
                        DemonstrateUtil.showLogResult("onComplete: ");
                    }
                });
    }


    private void show0() {
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                while (true) {
                    for (int i = 0; i < 129; i++) {
                        e.onNext(1);
                    }
                }
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Thread.sleep(5000);
                        DemonstrateUtil.showLogResult("接受到" + integer);
                    }
                });
    }


    private void initView() {
        btnBackpressure = (Button) findViewById(R.id.btn_backpressure);
        btnBackpressure.setOnClickListener(RxJavaDemo3Activity.this);
    }
}