深入理解RxJava编程思想

深入理解编程思想 前言
在中,一个实现了接口的对象可以订阅()一个 类的实例 。订阅者()对发射(emit)的任何数据或数据序列作出响应 。这种模式简化了并发操作,因为它不需要阻塞等待发射数据,而是创建了一个处于待命状态的观察者哨兵,哨兵在未来某个时刻响应的通知 。
为什么学习?
通过学习改变思维来提升效率
要想弄明白实现原理,就先学会怎么使用它 。
应用场景 核心思想
是一种响应式编程思维 (起点--------->终点)
举一个生活中的例子:
起点(分发事件:我饿了)----------->下楼---------->去餐厅------------>点餐------------>终点(吃饭 消费事件)
程序中的例子:
起点(分发事件:点击登录)---------->登录API--------->请求服务器---------->获取响应码--------->终点(更新UI 登录成功 消费事件)
也就是说,我们的起点和终点始终是链接在一起的,没有被断掉,中间的过程是一环扣一环 。
我们通过一个实现下载图片的功能的代码来比较传统思维和Rx思维
首先我们有一个需求:
网络获取图片显示在UI上 。
传统的思维方式下载图片:
// 传统方式 思维 无法固定 (后面接手你写的项目,看不懂)// A程序员:35356453 自己的思维 不同封装方法....// B程序员:46576576 自己的思维 不同全部写在一起// C程序员:43643654 自己的思维 不同new Thread// D程序员:66545655 自己的思维 不同使用 线程池// .....// 零零散散 麻烦public void downloadImageAction(View view) {progressDialog = new ProgressDialog(this);progressDialog.setTitle("下载图片中.....");progressDialog.show();new Thread(new Runnable() {@Overridepublic void run() {try {URL url = new URL(PATH);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(5000);connection.connect();int responseCode = connection.getResponseCode();Log.d(TAG, "apply: " + responseCode);if (responseCode == HttpURLConnection.HTTP_OK) {InputStream inputStream = connection.getInputStream();Bitmap bitmap = BitmapFactory.decodeStream(inputStream);Message message = handler.obtainMessage();message.obj = bitmap;handler.sendMessage(message);}} catch (Exception e) {e.printStackTrace();}}}).start();}private final Handler handler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(@NonNull Message msg) {Bitmap bitmap = (Bitmap) msg.obj;imageView.setImageBitmap(bitmap);if (progressDialog != null) {progressDialog.dismiss();}return false;}});
首先创建一个,把网络图片地址传进去,通过进行网络请求,将输入流转换成,通过将发送给主线程更新UI 。这是我们用传统思维实现的功能 。
接下来我们使用Rx思维:
我们首先画一个基本流程图来描述事件的流向:
接下来我们用代码实现:
public void rxJavaDownloadImageAction(View view) {//起点Observable.just(PATH) //内部会分发//TODO 第二步//TODO 第三步卡片式拦截把String拦截成Bitmap.map(new Function, Bitmap>() {@Overridepublic Bitmap apply(String s) throws Exception {URL url = new URL(PATH);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(5000);int responseCode = connection.getResponseCode();Log.d(TAG, "apply: " + responseCode);if (responseCode == HttpURLConnection.HTTP_OK) {InputStream inputStream = connection.getInputStream();Bitmap bitmap = BitmapFactory.decodeStream(inputStream);return bitmap;}return null;}})//加水印.map(new Function() {@Overridepublic Bitmap apply(Bitmap bitmap) throws Exception {Paint paint = new Paint();paint.setTextSize(88);paint.setColor(Color.RED);return drawTextToBitmap(bitmap, "同学们大家好", paint, 88, 88);}})//日志记录.map(new Function