Square全家桶前传——RxJava函数式编程入门(一)

来源:互联网 发布:工商行政管理网络教学 编辑:程序博客网 时间:2024/05/18 03:59

前言:作为Android开发者,构建项目应该更多地把精力放在业务逻辑上,于是一个完整的框架显得十分有价值。而且在搭建框架的过程中可以对软件开发有更深入的理解。于是博主打算开始构建一个完整的属于自己的框架,Square全家桶便是搭建框架的第一选择。接下来我将学习Square的几大著名的框架:RxJava(响应式编程),ButterKnife(依赖注入),Retrofit,Okhttp(网络请求),Picasso(图片加载缓存),EventBus(事件总线),Gson(Json解析)并利用它们来搭建自己的应用框架,下面开始RxJava的学习。

RxJava的github地址:https://github.com/ReactiveX/RxJava
RxJava请求图片简单Demo:https://github.com/VinceBarry/SquareDemo
给Android开发者的RxJava详解:http://gank.io/post/560e15be2dca930e00da1083#toc_1
深入浅出RxJava:http://blog.csdn.net/lzyzsd/article/details/41833541


简介

在说明RxJava是什么之前,先大概说一下设计模式中的观察者模式(Publish–subscribe_pattern)。维基百科上的定义是这样的:In software architecture, publish–subscribe is a messaging pattern where senders of messages, called publishers, do not program the messages to be sent directly to specific receivers, called subscribers, but instead characterize published messages into classes without knowledge of which subscribers, if any, there may be. Similarly, subscribers express interest in one or more classes and only receive messages that are of interest, without knowledge of which publishers, if any, there are.也就是说,观察者模式包含两个对象:Publisher(事件源)和Subscribe(观察者)。事件源不关心自己应该把消息传递给哪些接收器,在它本身的状态改变时主动发出通知,而观察者则关心自己关联的事件源本身是否发生变化,一旦变化便做出响应。RxJava基本采用了观察者模式,利用观察者模式实现一些异步的操作。RxJava优点在于其相比Handler和AsyncTask而言逻辑简洁。下面博主利用使用RxJava来实现异步请求下载网络图片并将其加载在本地控件上的例子来讲解RxJava的基本使用。基本概念用粗体标出。由于我也是新手,存在疏漏请指正。

实现

RxJava的四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。实质上就是观察者模式的基本概念。被观察者通过subscribe()方法与观察者实现订阅关系,之后一有事件发出就通知观察者。
先导入依赖:
OK,很明显我们需要先把基础的思路理清:我们将通过事件源来实现在IO线程中获取并下载图片,一旦下载完成,便通知订阅者,订阅者在主线程中做出相应(弹出Toast“下载完成”)。新建事件源的代码如下:

Observable.create(new Observable.OnSubscribe<Bitmap>() {            @Override            public void call(Subscriber<? super Bitmap> subscriber) {                Bitmap bitmap = null;                try {                    bitmap = Picasso.with(context).load(url).get();                } catch (IOException e) {                    e.printStackTrace();                }                if (bitmap == null) {                    subscriber.onError(new Exception("Couldn't download the picture"));                }                subscriber.onNext(bitmap);                subscriber.onCompleted();            }        }).subscribeOn(Schedulers.io());

上面代码新建了一个存储Bitmap数据的事件源队列,然后通过Picasso库请求网络图片(关于Picasso后面的文章有讲解)获取Bitmap对象,将Bitmap对象塞入事件源并通过onNext()方法通知订阅者。注意subscribeOn(Schedulers.io())方法,Scheduler调度器的使用表明事件源在IO线程中进行。关于调度器的用法参见上面的文章。

然后新建一个订阅者

Observer<Bitmap> observer = new Observer<Bitmap>() {            @Override            public void onCompleted() {            }            @Override            public void onError(Throwable e) {            }            @Override            public void onNext(Bitmap bitmap) {                mIv.setImageBitmap(bitmap);                Toast.makeText(MainActivity.this,"Picture",Toast.LENGTH_SHORT).show();            }        };

上面的订阅者采用最普遍最容易理解的方式,除了这种方式还有just()和from()两种方式。just(T…): 将传入的参数依次发送出来。from(T[]) / from(Iterable

Subscription s = RxPic.saveImage(MainActivity.this,"http://img2.imgtn.bdimg.com/it/u=3234625060,3330214688&fm=21&gp=0.jpg","Hello")                .observeOn(AndroidSchedulers.mainThread())                .subscribe(observer);        if (this.mCompositeSubscription == null) {            this.mCompositeSubscription = new CompositeSubscription();        }        this.mCompositeSubscription.add(s);

然后就是订阅者订阅事件源,通过将Observer和Observable关联到Subscription,然后使用CompsiteSubscription来添加此Subscription。完成以上操作我们就实现了异步请求网络图片并加载到ImageView中。

总结

RxJava的使用最主要是理解观察者模式,四个基本概念及其创建,如何订阅事件源和函数式编程(由于本文只是入门介绍,没有提到RxJava的函数编程,读者可以通过上面的链接进行学习,或者阅读博主下一篇博客),具体的Demo也参见上文中的博主的Github,如有错误求指正。

0 0