Android-RxJava(异步处理机制)

RxJava

观察者模式

Observer(观察者) --> OnclickListener
Observable(被观察者) --> button
subscribe(订阅) --> setOnclickListener
onNext(事件) --> onclick()

除了onNext之外还有两个事件
onCompleted()onError()
这两个事件放在最后,而且运行了其中一个,不会再调用另一个

详解

  • Observser/Subsrciber(观察者)

subsrciber和observer一样,但是subsrciber多了一个onStart()方法,会在subscribe(订阅)刚开始,事件还未发送之前被调用,可以用来做 数据的清零重置
unsubscribe() 取消订阅,这个方法调用后,subscriber将不再接收事件

  • Observable(被观察者)
Observable observable = Observable.create(new Observable.OnSubscribe(){
    @Override
    public void call(Subscriber subscriber){
    
    }
});

当observable被订阅时,就会自动调用 call() 方法

create() 方法是RxJava最基本的创造事件序列方法

还有两种

just() 方法:将传入的参数依次发送出来

比如:Observable observable = Observable.just("hello", "hi");
    相当于依次调用
    onNext("hello");
    onNext("hi");
    onCompleted();

from() 方法:将传入的数组或Iterable拆分成具体对象后,依次发送出来

比如:String[] words = {"hello", "hi"};
    Observable observable = Observable.from(words);
  • Subscribe(订阅)
    创建了Observer和Observable之后,使用 subscribe() 联结

observable.subscribe(observer)
或者
observable.subscribe(subscriber)

subscribe支持不完整定义的回调,RxJava会自动创建出subscriber

Action1 onNextAction = new Action1(){
    //相当于调用onNext方法
	@Override
	public void call(String s) {
    	Log.d(tag, s);
	}
}

Action0 onCompletedAction = new Action0(){
    //相当于调用onCompleted方法
	@Override
	public void call() {
    	Log.d(tag, s);
	}
}

//自动创建subscriber,并使用onNextAction来定义onNext()
observable.subscribe(onNextAction);
//自动创建subscriber,并使用onNextAction来定义onNext(),使用onCompletedAction来定义onCompleted()
observable.subscribe(onNextAction, onCompletedAction);

Action0和Action1是接口,只有一个方法call()
Action0可将onCompleted()内容打包(onCompleted方法无参数无返回值)
Action1可将onNext()和onError()内容打包(onNext和onError方法单参数无返回值)

例子

  • 使用Action来完成一次RxJava
String[] names = ...;
Observable.from(names)	//创建observable
        .subscribe(new Action1() {		//订阅并自动创建subscriber
        	@Override
       		public void call(String name) {		//相当于调用onNext()方法打印名字
        		Log.d(tag, name);
        	}
    	});
  • 常规完成一次RxJava
int drawableRes = ...;
ImageView imageView = ...;
Observable.create(new OnSubscribe() {  //创建Observable
    		@Override
    		public void call(Subscriber subscriber) {
        		Drawable drawable = getTheme().getDrawable(drawableRes));
        		subscriber.onNext(drawable);	//调用subscriber的onNext()方法
        		subscriber.onCompleted();
    		}
	}).subscribe(new Observer() {	//订阅,然后调用Observable的call()方法
    		@Override
    		public void onNext(Drawable drawable) {
        		imageView.setImageDrawable(drawable);
    		}

    		@Override
    		public void onCompleted() {
    		}

    		@Override
    		public void onError(Throwable e) {
        		Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
    		}
	});

Scheduler(线程控制)

Schedulers.immediate();		//直接在当前线程运行
Schedulers.newThread();	    //启用新线程,并在新线程中运行
Schedulers.io();			//读写文件,读写数据库,网络信息交互等
AndroidSchedulers.mainThread()	//指定的操作将在Android主线程运行

subscribeOn()指定subscribe()发生的线程,即订阅时运行的线程,就是call()方法运行的线程
(只能调用一次,而且是第一个才有用)

observeOn()指定subscriber运行的线程,即回调发生的线程,就是onNext()等方法运行的线程
(不限次数)

Scheduler的原理(变换)

第一种变换 map()

Observable.just("images/logo.png") // 输入类型 String
    	.map(new Func1() {
            @Override
            public Bitmap call(String filePath) { // 参数类型 String
                return getBitmapFromPath(filePath); // 返回类型 Bitmap
            }
        }).subscribe(new Action1() {
            @Override
            public void call(Bitmap bitmap) { // 参数类型 Bitmap
                showBitmap(bitmap);
            }
        });

Func1和Action1类似,FuncX包装的是有返回值的方法
调用map()方法后,String对象转变成bitmap对象后返回

第二种变换 flatMap()

Student[] students = ...;
Subscriber subscriber = new Subscriber() {
	@Override
	public void onNext(Course course) {
 	   Log.d(tag, course.getName());
	}
};
Observable.from(students)
    .flatMap(new Func1>() {
        @Override		
        //激活observable对象
        public Observable call(Student student) {
            return Observable.from(student.getCourses());	//依次发送学生成绩,汇入同一个Observable,然后统一交给onNext()
        }
    }).subscribe(subscriber);

个人总结

Action0 无参数无返回值
Action1 有参数无返回值
Func1 有参数有返回值

你可能感兴趣的:(Android-RxJava(异步处理机制))