android RxJava 详解应用事例

RxJava的使用总感觉比较麻烦, 最近仔细看了一些关于这方面的讲解,写了一个测试Demo,还是见代码吧!

参考见<<给 Android 开发者的 RxJava 详解>>http://gank.io/post/560e15be2dca930e00da1083

  • Demo 中有handler在程序中消息处理与RxJava替代hanlder处理方式的比较,以及关于RxJava_android 的使用。使用RxJava_的大致思路:创建出 Observable 和 Subscriber ,再用 subscribe() 将它们串起来。
  • 形式如下:
  • Observable.subscribe( Subscriber);解读,Observable,被观察者;subscribe :订阅,注册机制;Subscriber:观察者,我个人理解为,Observable加载的信息,通知给Subscriber。

build.gradle

github rxjava见https://github.com/ReactiveX/RxAndroid/https://github.com/ReactiveX/RxJava;

 compile 'io.reactivex:rxandroid:1.2.1'
 compile 'io.reactivex:rxjava:1.1.6'    

观察 与 被观察

观察者被观察者
Observer,SubscriberObservable.create(OnSubscribe),Observable.create(OnSubscribe)
Action1< T > ,Action0< T >Observable.just(T…),Observable.from(T[ ])

可以使用冒号来定义对齐方式:

just(T…) 的和 from(T[]) 的例子,都和之前的 create(OnSubscribe) 是等价的。
创建了 Observable 和 Observer 之后,再用 subscribe() 方法将它们联结起来

observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);

见代码:
MainActivity.java

package dome.rxjava.com.rxjavademo;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
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;

/**
 * 关于RxJava_android 的使用。
 * 创建出 Observable 和 Subscriber ,再用 subscribe() 将它们串起来,
 * 形式如下:
 * Observable.subscribe( Subscriber);
 * 解读,Observable,被观察者;subscribe :订阅,注册机制;Subscriber:观察者,
 * 我个人理解为,Observable加载的信息,通知给Subscriber。
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private String TAG = "MainActivity";
    private TextView handlerTestTv;
    private TextView testRxJavaCreatTv;
    private TextView testSubscriberTv;
    private TextView testObservableFromTv;
    private TextView testObservableJustTv;
    private TextView testObservableMapTv;
    private TextView contentTv;
    private ImageView contentImage;

    private List<String> arrayList;
    private int post = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handlerTestTv = (TextView) findViewById(R.id.handlerTestTv);
        handlerTestTv.setOnClickListener(this);
        testRxJavaCreatTv = (TextView) findViewById(R.id.testRxJavaCreatTv);
        testRxJavaCreatTv.setOnClickListener(this);
        testSubscriberTv = (TextView) findViewById(R.id.testSubscriberTv);
        testSubscriberTv.setOnClickListener(this);
        testObservableFromTv = (TextView) findViewById(R.id.testObservableFromTv);
        testObservableFromTv.setOnClickListener(this);
        testObservableJustTv = (TextView) findViewById(R.id.testObservableJustTv);
        testObservableJustTv.setOnClickListener(this);
        testObservableMapTv = (TextView) findViewById(R.id.testObservableMapTv);
        testObservableMapTv.setOnClickListener(this);


        contentTv = (TextView) findViewById(R.id.contentTv);
        contentImage = (ImageView) findViewById(R.id.contentImage);


        arrayList = new ArrayList<>();
        arrayList.add("姓名:");
        arrayList.add("年龄:");
        arrayList.add("成绩:");
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.handlerTestTv:
                handler();
                break;
            case R.id.testRxJavaCreatTv:
                rxJavaCreat();
                break;
            case R.id.testSubscriberTv:
                testSubscriber();
                break;
            case R.id.testObservableFromTv:
                testObservableFrom();
                break;
            case R.id.testObservableJustTv:
                testObservableJust();
                break;
            case R.id.testObservableMapTv:
                testObservableMap();
                break;
            default:

        }


    }

    public void handler() {
        Toast.makeText(MainActivity.this, "handler测试", Toast.LENGTH_SHORT).show();
        post = 0;
        startThread();

    }

    public void rxJavaCreat() {
        post = 1;
        Toast.makeText(MainActivity.this, "RxJavaCreat测试", Toast.LENGTH_SHORT).show();
        startThread();

    }

    public void testSubscriber() {
        post = 2;
        Toast.makeText(MainActivity.this, "RxJavaCreat测试", Toast.LENGTH_SHORT).show();
        startThread();


    }

    public void testObservableFrom() {
        post = 3;
        Toast.makeText(MainActivity.this, "RxJavaFrom测试", Toast.LENGTH_SHORT).show();
        startThread();

    }

    private void testObservableJust() {

        post = 4;
        Toast.makeText(MainActivity.this, "RxJavaJust测试", Toast.LENGTH_SHORT).show();
        startThread();


    }

    private void testObservableMap() {
        post = 5;
        Toast.makeText(MainActivity.this, "RxJavaJust测试", Toast.LENGTH_SHORT).show();
        startThread();


    }


    /**
     * 模拟在非UI线程,共同的线程运行环境下,handler,与RxJava的运行
     */
    private void startThread() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (post == 0) doHandler();
                if (post == 1) doRxJava_ObservableCreat();
                if (post == 2) doObserver();
                if (post == 3) doObservableFrom();
                if (post == 4) doObservableJust();
                if (post == 5) doObservableMap();

            }
        }).start();


    }

    /**
     * Observable与Subscriber
     * Observable().observeOn()---指定 Subscriber 的回调发生在主线程,刷新UI线程。
     * <p>
     * Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。
     * Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。
     * Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。
     * 行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,
     * 可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。
     */
    private void doRxJava_ObservableCreat() {
        //第一种形式,被观察者

        /**
         *  这个就类似handler.sendMessage()
         *
         *
         */

        getObservableCreate()
//                .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
                .observeOn(AndroidSchedulers.mainThread())// Android 还有一个专用的 AndroidSchedulers.mainThread().它指定的操作将在 Android 主线程运行。
                .subscribe(mSubscriber);

    }

    /**
     * Observable与observer
     */
    private void doObserver() {

        //这个就类似handler.sendMessage()
        getObservableCreate().subscribeOn(AndroidSchedulers.mainThread()).subscribe(observer);


    }

    /**
     * Observable.from()与Action1
     */
    private void doObservableFrom() {

        getObservableFrom().subscribe(action1);
//        getObservableFrom().subscribe(mSubscriber);//这种方式没有输出结果,我不知道为什么

    }

    /**
     * Observable.just()与Action1,可以放入1--3个action
     */
    private void doObservableJust() {
        /**
         * 经过代码测试,如果第一个action1与第二个onErrorAction里面的参数类型一致,第二个不执行
         */
        getObservableJust().subscribeOn(AndroidSchedulers.mainThread()).subscribe(action1, onErrorAction, onCompletedAction);
    }


    /**
     * <p>
     * Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。
     *Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。
     *Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。
     *Schedulers.computation(): 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。
     *另外, Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
     * </p>
     * Observable.map((new Func1<String, Bitmap>()),Func1的第一个参数类型String为输入参数类型,第二个为返回值参数类型
     * Observable.subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程
     * Observable.observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
     */
    private void doObservableMap() {

        getObservableJust("banner.png")
                .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
                .observeOn(AndroidSchedulers.mainThread())//即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。 * observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
                .map(getBitmapFuncl)
                .subscribe(showBitmapAction);


    }
    Func1<String, Bitmap> getBitmapFuncl = new Func1<String, Bitmap>() {
        @Override
        public Bitmap call(String filePath) { // 参数类型 String
            Log.e(TAG, "filePath========" + filePath);
            return getBitmapFromPath(filePath); // 返回类型 Bitmap
        }

    };
    Action1<Bitmap> showBitmapAction  =new Action1<Bitmap>() {

        @Override
        public void call(Bitmap bitmap) {
            contentImage.setImageBitmap(bitmap);
        }
    };
    Action1<String> action1 = new Action1<String>() {
        @Override
        public void call(String s) {
            contentTv.setText(s);
            Toast.makeText(MainActivity.this, "action1===Item:==" + s, Toast.LENGTH_SHORT).show();
            Log.e(TAG, "action1xxxxxxxxxxx===Item: " + s);
        }
    };
    Action1<Throwable> onErrorAction = new Action1<Throwable>() {
        @Override
        public void call(Throwable s) {

            Toast.makeText(MainActivity.this, "onErrorAction===Item:==" + s, Toast.LENGTH_SHORT).show();
            Log.e(TAG, "action2yyyyyyyyyyyyyy===Item: " + s);
        }
    };
    Action0 onCompletedAction = new Action0() {
        @Override
        public void call() {

            Toast.makeText(MainActivity.this, "onCompletedAction===Item:==", Toast.LENGTH_SHORT).show();
            Log.e(TAG, "onCompletedAction===Item: ");
        }
    };

    Observer<String> observer = new Observer<String>() {
        @Override
        public void onNext(String s) {
            contentTv.setText(s);
            Toast.makeText(MainActivity.this, "observer===Item:=====" + s, Toast.LENGTH_SHORT).show();
            Log.e(TAG, "observer===Item: " + s);

        }

        @Override
        public void onCompleted() {
            Log.e(TAG, "action2yyyyyyyyyyyyyy===Item: " + "onCompleted");

            Log.d(TAG, "Completed!");
        }

        @Override
        public void onError(Throwable e) {
            Log.d(TAG, "Error!");
        }
    };


    /**
     * 观察者Subscriber,Observer 的子类,被观察者 myObservable
     */
    private Subscriber<String> mSubscriber = new Subscriber<String>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(String s) {
            contentTv.setText(s);
            Toast.makeText(MainActivity.this, "观察者输出的数据=====" + s, Toast.LENGTH_SHORT).show();
            Log.e("tag", "观察者输出的数据=====" + s);


        }
    };

    private Handler myHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            contentTv.setText(msg.obj.toString());
            Log.e("tag", "myHandler=====" + msg.obj.toString());
        }
    };

    /**
     * handler处理方式
     */
    private void doHandler() {
        for (int i = 0; i < arrayList.size(); i++) {
            Message mg = myHandler.obtainMessage(0, arrayList.get(i));
            myHandler.sendMessage(mg);
        }


    }

    /**
     * 第一种,Observable,被观察者
     *
     * @return
     */
    private Observable<String> getObservableCreate() {

        Observable<String> myObservable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                for (int i = 0; i < arrayList.size(); i++) {
                    subscriber.onNext(arrayList.get(i));
                }
                subscriber.onCompleted();

            }
        });

        return myObservable;

    }


    private Observable getObservableFrom() {
        //注意Observable<String>里的泛型String与Observable.from()传入的参数类型一致
//        String[] strs = new String[arrayList.size()];
//        for (int i = 0; i < arrayList.size(); i++) {
//            strs[i] = arrayList.get(i);
//
//        }
//    return     Observable.from(strs).subscribeOn(AndroidSchedulers.mainThread())
        /**
         * Observable.from(),可传入参数为数组(E[])与List集合
         */
        return Observable.from(arrayList).subscribeOn(AndroidSchedulers.mainThread());
    }


    private Observable getObservableJust() {
        return Observable.just(arrayList.get(0), arrayList.get(1), arrayList.get(2));
    }

    private Observable getObservableJust(String file) {
        return Observable.just(file).subscribeOn(Schedulers.io()).subscribeOn(AndroidSchedulers.mainThread());

    }

    private Bitmap getBitmapFromPath(String filePath) {
        InputStream in = null;
        Bitmap bm = null;
        try {
            in = getResources().getAssets().open(filePath);
            bm = BitmapFactory.decodeStream(in);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return bm;
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="dome.rxjava.com.rxjavademo.MainActivity">

    <TextView
        android:id="@+id/handlerTestTv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:background="@color/colortv"
        android:text="handler测试"
        android:textSize="15sp" />

    <TextView
        android:id="@+id/testRxJavaCreatTv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:background="@color/colortv"
        android:text="testRxJava_ObservableCreat测试"
        android:textSize="15sp" />

    <TextView
        android:id="@+id/testSubscriberTv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:background="@color/colortv"
        android:text="SuscriberCreat测试"
        android:textSize="15sp" />
    <TextView
        android:id="@+id/testObservableFromTv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:background="@color/colortv"
        android:text="testObservableFrom测试"
        android:textSize="15sp" />

    <TextView
        android:id="@+id/testObservableJustTv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:background="@color/colortv"
        android:text="testObservableJsut测试"
        android:textSize="15sp" />
    <TextView
        android:id="@+id/testObservableMapTv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:background="@color/colortv"
        android:text="testObservableMap测试"
        android:textSize="15sp" />

    <TextView
        android:id="@+id/contentTv"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="15dp"
        android:background="@color/colortv"
        android:text="显示内容,更新UI结果用"
        android:textSize="15sp" />
    <ImageView
        android:id="@+id/contentImage"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="15dp"
    />
</LinearLayout>

()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值