先举个案例给下载的url加水印
首先添加依赖:
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.7'
一般写法
public class MainActivity extends AppCompatActivity {
private ImageView mImage;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
Bitmap bitmap = (Bitmap) msg.obj;
mImage.setImageBitmap(bitmap);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImage= (ImageView) findViewById(R.id.image1);
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL("http://d.paper.i4.cn/max/2016/10/10/15/1476085552237_716159.jpg");
HttpURLConnection httpsURLConnection = (HttpURLConnection) url.openConnection();
httpsURLConnection.connect();
InputStream inputStream = httpsURLConnection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//创建水印
bitmap = createWatermark(bitmap, "rxjava");
// 显示到图片
Message message = Message.obtain();
message.obj = bitmap;
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private Bitmap createWatermark(Bitmap bitmap, String mark) {
int w=bitmap.getWidth();
int h=bitmap.getHeight();
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(bmp);
Paint paint=new Paint();
//颜色
paint.setColor(Color.parseColor("#C5FF0000"));
//设置字体大小
paint.setTextSize(50);
//设置抗锯齿
paint.setAntiAlias(true);
//绘制图像
canvas.drawBitmap(bitmap, 0, 0, paint);
//绘制文字
canvas.drawText(mark,0,h/2,paint);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return bmp;
}
}
rxjava的写法
public class MainActivity1 extends AppCompatActivity {
private ImageView mImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImage = (ImageView) findViewById(R.id.image1);
Observable.just("http://d.paper.i4.cn/max/2016/10/10/15/1476085552237_716159.jpg")
.map(new Function<String, Bitmap>() {
@Override
public Bitmap apply(@NonNull String s) throws Exception {
URL url = new URL("http://d.paper.i4.cn/max/2016/10/10/15/1476085552237_716159.jpg");
HttpURLConnection httpsURLConnection = (HttpURLConnection) url.openConnection();
httpsURLConnection.connect();
InputStream inputStream = httpsURLConnection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}
}).map(new Function<Bitmap, Bitmap>() {
@Override
public Bitmap apply(@NonNull Bitmap bitmap) throws Exception {
bitmap = createWatermark(bitmap, "rxjava");
return bitmap;
}
}).subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Bitmap>() {
@Override
public void accept(Bitmap bitmap) throws Exception {
mImage.setImageBitmap(bitmap);
}
});
}
private Bitmap createWatermark(Bitmap bitmap, String mark) {
int w = bitmap.getWidth();
int h = bitmap.getHeight();
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
Paint paint = new Paint();
//颜色
paint.setColor(Color.parseColor("#C5FF0000"));
//设置字体大小
paint.setTextSize(50);
//设置抗锯齿
paint.setAntiAlias(true);
//绘制图像
canvas.drawBitmap(bitmap, 0, 0, paint);
//绘制文字
canvas.drawText(mark, 0, h / 2, paint);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return bmp;
}
}
看下rxjava测试订阅并手写
Observable.just("http://d.paper.i4.cn/max/2016/10/10/15/1476085552237_716159.jpg")
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("TAG","onSubscribe");
}
@Override
public void onNext(@NonNull String s) {
Log.e("TAG","onNext = "+s);
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("TAG","onError");
}
@Override
public void onComplete() {
Log.e("TAG","onComplete");
}
});
just源码
public static <T> Observable<T> just(T item) {
ObjectHelper.requireNonNull(item, "The item is null");
//将String转换成ObservableJust对象
return RxJavaPlugins.onAssembly(new ObservableJust<T>(item));
}
subscribe源码分析
//返回observer
observer = RxJavaPlugins.onSubscribe(this, observer);
ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");
//这个实际是个抽象方法,看ObservableJust对象的这个方法
subscribeActual(observer);
@Override
protected void subscribeActual(Observer<? super T> s) {
//value是我们刚才传过来的值,实际是将observer和value进行封装
ScalarDisposable<T> sd = new ScalarDisposable<T>(s, value);
//首先执行observer中的onSubscribe方法
s.onSubscribe(sd);
sd.run();
}
run源码
@Override
public void run() {
if (get() == START && compareAndSet(START, ON_NEXT)) {
//执行onNext方法
observer.onNext(value);
if (get() == ON_NEXT) {
lazySet(ON_COMPLETE);
//执行完成方法
observer.onComplete();
}
}
}
手写订阅
观察者
public interface Observer<T> {
void onSubscribe();
void onNext(@NonNull T s);
void onError(@NonNull Throwable e);
void onComplete();
}
被观察者ObservableSource
public interface ObservableSource<T> {
void subscribe(@NonNull Observer<? super T> observer);
}
Observable
public abstract class Observable<T> implements ObservableSource<T> {
public static <T> ObservableSource<T> just(T item) {
return onAssembly(new ObservableJust<T>(item));
}
//实际就是返回ObservableJust对象
private static <T> ObservableSource<T> onAssembly(ObservableJust<T> source) {
return source;
}
@Override
public void subscribe(@NonNull Observer<? super T> observer) {
subscribeActual(observer);
}
//订阅
protected abstract void subscribeActual(Observer<? super T> observer);
}
ObservableJust封装和执行的地方
public class ObservableJust<T> extends Observable<T> {
private T item;
public ObservableJust(T item) {
this.item=item;
}
@Override
protected void subscribeActual(Observer<? super T> observer) {
//对observer和value进行封装
ScalarDisposable sd=new ScalarDisposable(observer,item);
observer.onSubscribe();
sd.run();
}
//执行在这个类
private class ScalarDisposable<T>{
private Observer observer;
private T item;
public ScalarDisposable(Observer<T> observer, T item) {
this.observer = observer;
this.item = item;
}
public void run() {
try {
observer.onNext(item);
observer.onComplete();
} catch (Exception e) {
observer.onError(e);
}
}
}
}
测试
mImage= (ImageView) findViewById(R.id.image1);
Observable.just("http://d.paper.i4.cn/max/2016/10/10/15/1476085552237_716159.jpg")
.subscribe(new Observer<String>() {//T
@Override
public void onSubscribe() {
Log.e("TAG","onSubscribe");
}
@Override
public void onNext(@NonNull String s) {
Log.e("TAG","onNext = "+s);
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("TAG","onError");
}
@Override
public void onComplete() {
Log.e("TAG","onComplete");
}
});