RxJava源码阅读,map操作符(二)

167 阅读1分钟

1.基本写法

Observable.just("https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/5/17/16ac4f7f486ca77a~tplv-t2oaga2asx-image.image")
                   .map(new Function<String, Bitmap>() {
                       @Override
                       public Bitmap apply(String urlPath) throws Exception {
                           URL url = new URL(urlPath);
                           HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                           InputStream inputStream = urlConnection.getInputStream();
                           Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                           return bitmap;
                       }
                   }).subscribe(new Consumer<Bitmap>() {
                       @Override
                       public void onNext(final Bitmap bitmap) {
                           runOnUiThread(new Runnable() {
                               @Override
                               public void run() {
                                   mImage.setImageBitmap(bitmap);
                               }
                           });
                       }
                   });

2.map做了什么

RxJava源码阅读(一) 一样Observable.just()创建了一个ObservableJust,通过map操作符后生成了一个ObservableMap

public ObservableMap(ObservableSource<T> source, Function<? super T, ? extends U> function) {
        super(source);
        this.function = function;
}

ObservableMap构造方法中第一个参数持有了ObservableJust引用,相当于是ObservableJust的动态代理。同样,最终执行的是ObservableMapsubscribeActual方法

@Override
public void subscribeActual(Observer<? super U> t) {
    source.subscribe(new MapObserver<T, U>(t, function));
}

其中source就是传入的ObservableJust,只是在调用subscribe方法时又包裹了下,将传入的Observer包装成MapObserver

3.总结

Observable.just("")
        .map(new Function<String, String>() {
            @Override
            public String apply(String urlPath) {
                return urlPath;
            }
        })
        .map(new Function<String, String>() {
            @Override
            public String apply(String urlPath) {
                return urlPath;
            }
        }).subscribe(new Consumer<String>() {
        @Override
            public void onNext(final String bitmap) {
            }
        });