整个Demo学习下RXJava。
直接上代码。
在gradle中添加依赖:
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
不控制线程
package acxingyun.cetcs.com.rxjava;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import rx.Observable;
import rx.Observer;
import rx.Subscriber;
public class RXJavaActivity extends Activity {
private static final String tag = "RXJavaActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rxjava);
//创建观察者
Observer<String> observer = new Observer<String>() {
@Override
public void onCompleted() {
Log.i("onCompleted ---> ", "完成");
}
@Override
public void onError(Throwable e) {
Log.i("onError ---> ", e.toString());
}
@Override
public void onNext(String s) {
Log.i("onNext ---> ", "Item: " + s);
}
};
//创建被观察者
Observable observable = Observable.create(new Observable.OnSubscribe<String>(){
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("hello");
subscriber.onNext("world");
subscriber.onNext("byebye");
subscriber.onCompleted();
}
});
//被观察者注册观察者,类似Button.setOnClickListener(new View.OnClickListener());
observable.subscribe(observer);
}
}
运行结果:
事件在主线程发生。
进行线程控制
用线程处理耗时操作。
下面使用Glide从网络取一张图片展示在imageview中。
在gradle中添加依赖:
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:26.+'
在manifest中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
按键点击响应:
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadImage();
}
});
加载图片
private void loadImage(){
//创建被观察者
Observable observable = Observable.create(new Observable.OnSubscribe<Bitmap>(){
@Override
public void call(Subscriber<? super Bitmap> subscriber) {
Log.i(" call ---> ", "运行在 " + Thread.currentThread().getName() + " 线程");
//增加网络延时
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Bitmap bitmap = null;
try {
//用Glide将url转换成Bitmap
bitmap = Glide.with(RXJavaActivity.this).load(urlString).asBitmap().into(500, 500).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
//将bitmap传回给观察者
subscriber.onNext(bitmap);
subscriber.onCompleted();
}
//控制被观察者的事件在io线程执行
}).subscribeOn(Schedulers.io())
//控制观察者在主线程获取观察结果
.observeOn(AndroidSchedulers.mainThread());
//创建观察者
Observer observer = new Observer<Bitmap>() {
@Override
public void onCompleted() {
Log.i(" onCompleted ---> ", "运行在 " + Thread.currentThread().getName() + " 线程");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Bitmap bitmap) {
//处理被观察者传来的bitmap对象
iv1.setImageBitmap(bitmap);
Log.i(" onNext ---> ", "运行在 " + Thread.currentThread().getName() + " 线程");
}
};
//绑定观察者和被观察者,即订阅
observable.subscribe(observer);
}
Logcat结果:
call就是被观察者调用的,我盟控制它在线程中;onNext和onComplete是观察者调用的,被控制在主线程。
附上运行效果:
平时看下网上对RXJava的介绍看得头晕,自己跑个Demo就清楚了,就是个异步消息传递的过程,我的Demo中是分别创建了观察者和被观察者,再通过订阅绑定两者关系;用的熟练之后,可以直接使用链式调用完成全部代码:
Observable.create(new Observable.OnSubscribe<Bitmap>(){
@Override
public void call(Subscriber<? super Bitmap> subscriber) {
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Bitmap>(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Bitmap bitmap) {
}
});
时间有限,今天先熟悉基本用法,以后再进一步深入,我还要改bug~~~~~