这是用RxJava实现的一个简单demo
RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库),这就是 RxJava 。概括得非常精准(不过单凭靠这几句话也比较难理解)。
首先需要jar包:
dependencies {
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
}
/**
*点击按钮下载图片并显示;
imagePath ="http://images2015.cnblogs.com/blog/841455/201512/841455-20151201235212327-794268895.jpg";
*/
public void downLoadImage(View view) {
//Observable是被观察者;大家记住OnSubscribe<Bitmap>里面的bitmap;
Observable.create(new Observable.OnSubscribe<Bitmap>() {
@Override
public void call(Subscriber<? super Bitmap> subscriber) {
Bitmap bitmap = getBitMap();
//onNext的方法传入的参数;
subscriber.onNext(bitmap);
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.io())
.doOnSubscribe(new Action0() {
@Override
public void call() {
progressBar.setVisibility(View.VISIBLE);
}
})
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Bitmap>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
//得到onNext里面的参数
@Override
public void onNext(Bitmap bitmap) {
progressBar.setVisibility(View.GONE);
bitmapImage.setImageBitmap(bitmap);
}
});
}
public Bitmap getBitMap() {
try {
URL url = new URL(imagePath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
InputStream inputStream = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
Log.d("自定义打印说明", "getBitMap(): " + bitmap);
return bitmap;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
解释一下:
1.RxJava 有四个基本概念:
Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。
Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。
2.在 RxJava 中, Observable并不是在创建的时候就立即开始发送事件,而是在它被订阅的时候,即当 subscribe() 方法执行的时候。(当 Observable 被订阅的时候,OnSubscribe 的 call() 方法会自动被调用)
3.Scheduler (调度器),可以使用 它的subscribeOn() 和 observeOn() 两个方法来对线程进行控制。
subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程(事件产生的线程)
observeOn(): 指定 Subscriber 所运行在的线程(事件消费的线程)
4.因为指定是在io线程中,所以可以直接 Bitmap bitmap = getBitMap();不用再开线程;
注:感谢 作者:扔物线 的给 Android 开发者的 RxJava 详解