rxjava基本使用和源码分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24675479/article/details/79815712

先举个案例给下载的url加水印

首先添加依赖:

    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.1.7'

事件流.png

一般写法

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;
    }
}

image.png

看下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");
                   }
               });

猜你喜欢

转载自blog.csdn.net/qq_24675479/article/details/79815712