Rxjava使用以及源码分析

一、Rxjava 的核心思想
1、发布订阅模式,发布者发布信息,订阅者如果订阅了该信息,那么就可以获取该信息
2、举个例子: 下载图片 需要展示在ImageView上,下载图片相当于发布者,显示在ImageView上相当于订阅者,订阅者时刻观察发布者的动态,当下载图片完成后,立马显示在ImageView上
3、一件事情,有起点(下载图片) 有终点(展示在ImageView上)在这中间可以穿插任何的卡片信息
4、 比如在到达终点之前,可以给图片加上水印信息,这些都可以看做是穿插的卡片信息,上代码

 private final static String PATH = "http://pic1.win4000.com/wallpaper/c/53cdd1f7c1f21.jpg";
public void downLoad(View view) {
        Observable
                .just(PATH)   // 起点,内部会分发Path String todo 第二部
                // TODO 第三步, 请求网络下载图片
                .map(new Function<String, Bitmap>() {
                    @Override
                    public Bitmap apply(String path) throws Exception {
                        URL url = new URL(PATH);
                        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                        httpURLConnection.setConnectTimeout(5000);
                        int responseCode = httpURLConnection.getResponseCode(); // 才开始 request
                        if (responseCode == HttpURLConnection.HTTP_OK) {
                            InputStream inputStream = httpURLConnection.getInputStream();
                            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                            Thread.sleep(500);
                            return bitmap;
                        }
                        return null;
                    }
                })
                // 可以给下载好的图片加上水印,这里相当于穿插卡片信息
                .map(new Function<Bitmap, Bitmap>() {
                    @Override
                    public Bitmap apply(Bitmap bitmap) throws Exception {
                        Paint paint = new Paint();
                        paint.setColor(Color.RED);
                        paint.setTextSize(88);
                        return drawTextToBitmap(bitmap,"李国菁签名",paint,88,88);
                    }
                })
                .subscribeOn(Schedulers.io())//让上面被观察者,处于子线程
                .observeOn(AndroidSchedulers.mainThread())// 让下面观察者处于 主线程
                .subscribe(new Observer<Bitmap>() {
                    // 一定是主线程,为什么,因为 subscribe 马上调用onSubscribe
                    @Override
                    public void onSubscribe(Disposable d) {
                        // 预备 开始 要分发
                        // TODO 第一步
                        dialog = new ProgressDialog(DownLoadingActivity.this);
                        dialog.setTitle("正在加载中...");
                        dialog.show();
                    }

                    @Override
                    public void onNext(Bitmap bitmap) {
                        // TODO 第四步 设置 bitmap
                        ivImage.setImageBitmap(bitmap);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }
                    @Override
                    public void onComplete() {
                        // TODO 第五步 完成事件,取消Loading框
                        if (dialog != null){
                            dialog.dismiss();
                        }
                    }
                });
    }

    private final Bitmap drawTextToBitmap(Bitmap bitmap, String text, Paint paint, int paddingLeft, int paddingTop) {
        Bitmap.Config bitmapConfig = bitmap.getConfig();

        paint.setDither(true); // 获取跟清晰的图像采样
        paint.setFilterBitmap(true);// 过滤一些
        if (bitmapConfig == null) {
            bitmapConfig = Bitmap.Config.ARGB_8888;
        }
        bitmap = bitmap.copy(bitmapConfig, true);
        Canvas canvas = new Canvas(bitmap);

        canvas.drawText(text, paddingLeft, paddingTop, paint);
        return bitmap;
    }

二、Rxjava结合 Retrofit 的使用

public class HttpUtils {
    private static final String TAG = "HttpUtils";

    public static String BASE_URL = "https://www.wanandroid.com/";

    public static void setBaseUrl(String baseUrl) {
        BASE_URL = baseUrl;
    }

    /*
    * 根据各种配置返回 retrofit
    * */
    public static Retrofit getRetrofit(){
        OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
        OkHttpClient httpClient = httpBuilder
                .addNetworkInterceptor(new StethoInterceptor())
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .build();


        return new Retrofit.Builder()
                .baseUrl(BASE_URL)
                // TODO 请求用 OKhttp
                .client(httpClient)
                // TODO 响应RxJava
                // 添加一个json解析的工具
                .addConverterFactory(GsonConverterFactory.create(new Gson()))
                // 添加rxjava处理工具
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    }
}

public interface WanAndroidApi {
    // 总数据
    @GET("project/tree/json")
    Observable<ProjectBean> getProject(); // 异步线程 耗时操作

    // Item数据
    @GET("project/list/{pageIndex}/json")  // ?cid=294
    Observable<ProjectItem> getProjectItem(@Part("pageIndex") int pageIndex, @Query("cid") int cid);
}

private WanAndroidApi api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rx_java);
        ivImage = findViewById(R.id.ivImage);

        api = HttpUtils.getRetrofit().create(WanAndroidApi.class);
    }
    /**
     * TODO Retrofit+RxJava 查询 项目分类  (总数据查询)
     * @param view
     */
    public void rxjavaRetrofit(View view) {
        // 获取网络API
        api.getProject()
                .subscribeOn(Schedulers.io()) // 上面 异步
                .observeOn(AndroidSchedulers.mainThread()) // 下面 主线程
                .subscribe(new Consumer<ProjectBean>() {
                    @Override
                    public void accept(ProjectBean projectBean) throws Exception {
                        Log.i(TAG, "accept: " + projectBean); // UI 可以做事情
                    }
                });
    }

三、Rxjava 源码分析

如下图所示:
在这里插入图片描述

public class RxjavaTest2 {
    public static void main(String[] args) {
        Observable.create(
                // new 了一个 ObservableCreate 自定义数据源 == source,
                new ObservableOnSubscribe<String>() {

                    @Override
                    public void subscribe(ObservableEmitter<String> e) throws Exception {
                        System.out.println("2222222222");
                        e.onNext("hehehe");
                    }
        })
                // 上面返回: ObservableCreate.map
                .map(new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) throws Exception {
                        System.out.println("33333333333 :" + s);
                        return 895842;
                    }
                })
                // 上面返回: ObservableCreate.map
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        System.out.println("1111111111111");
                    }

                    @Override
                    public void onNext(Integer s) {
                        System.out.println("444444444 :" + s);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值