RxJava到底是什么?使用RxJava到底有什么好处呢?其实RxJava是ReactiveX中使用Java语言实现的版本,目前ReactiveX已经实现的语言版本有:
Java: RxJava
JavaScript: RxJS
C#: Rx.NET
C#(Unity): UniRx
Scala: RxScala
Clojure: RxClojure
C++: RxCpp
Ruby: Rx.rb
Python: RxPY
Groovy: RxGroovy
JRuby:RxJRuby
Kotlin: RxKotlin
可以看出ReactiveX在开发应用中如此的火爆。那到底什么是ReactiveX呢?简单来说,ReactiveX就是”观察者模式+迭代器模式+函数式编程”,它扩展了观察者模式,通过使用可观察的对象序列流来表述一系列事件,订阅者进行占点观察并对序列流做出反应(或持久化或输出显示等等);借鉴迭代器模式,对多个对象序列进行迭代输出,订阅者可以依次处理不同的对象序列;使用函数式编程思想(functional programming),极大简化问题解决的步骤。
2. Android RxJava使用完对象之后怎么处理
事件是传递的最小单位,可以把任何类作为一个事件。
RxBus代码如下:
/** * Author: wangjie * Email: [email protected] * Date: 6/11/15. */public class RxBus { private static final String TAG = RxBus.class.getSimpleName(); private static RxBus instance; public static boolean DEBUG = false; public static synchronized RxBus get() { if (null == instance) { instance = new RxBus(); } return instance; } private RxBus() { } private ConcurrentHashMap<Object, List<Subject>> subjectMapper = new ConcurrentHashMap<>(); @SuppressWarnings("unchecked") public <T> Observable<T> register(@NonNull Object tag, @NonNull Class<T> clazz) { List<Subject> subjectList = subjectMapper.get(tag); if (null == subjectList) { subjectList = new ArrayList<>(); subjectMapper.put(tag, subjectList); } Subject<T, T> subject; subjectList.add(subject = PublishSubject.create()); if (DEBUG) Log.d(TAG, "[register]subjectMapper: " + subjectMapper); return subject; } public void unregister(@NonNull Object tag, @NonNull Observable observable) { List<Subject> subjects = subjectMapper.get(tag); if (null != subjects) { subjects.remove((Subject) observable); if (ABTextUtil.isEmpty(subjects)) { subjectMapper.remove(tag); } } if (DEBUG) Log.d(TAG, "[unregister]subjectMapper: " + subjectMapper); } public void post(@NonNull Object content) { post(content.getClass().getName(), content); } @SuppressWarnings("unchecked") public void post(@NonNull Object tag, @NonNull Object content) { List<Subject> subjectList = subjectMapper.get(tag); if (!ABTextUtil.isEmpty(subjectList)) { for (Subject subject : subjectList) { subject.onNext(content); } } if (DEBUG) Log.d(TAG, "[send]subjectMapper: " + subjectMapper); }}
如上述代码,RxBus只提供了register、unregister、post三个方法。
这里又加入了一个tag的概念,也可以理解为channel,注册Subject、反注册Subject和post事件的时候都需要这个tag,只有tag一致才能正常接收到事件。
比如有一个事件类HelloEvent,这个事件的作用是接收到后toast一个提示“hello”,如果两个Activity都注册了这个HelloEvent事件,但是没有tag去限制,一旦post了一个helloEvent事件后,两个Activity都会收到这个事件,导致两个Activity都会toast。如果使用tag,post这个HelloEvent的时候可以设置这个tag,只有register时也使用了这个tag才会接收到这个event。
2. 在Present(如Activity的onCreate)中注册一个Observer(以下以发送一个String类型的事件为例)
Observable<String> addOb = RxBus.get() .register("addFeedTag", String.class); addOb.observeOn(AndroidSchelers.mainThread()) .subscribe(s -> { // todo: Accept event and process here });
如上,注册了一个String类型的事件,事件的tag是“addFeedTag”,用来增加一个Feed。使用RxAndroid在Action1中处理接收到的这个事件。
3. 在任何地方发送一个事件:
RxBus.get().post("addFeedTag", "hello RxBus!");
这里发送了一个tag为“addFeedTag”的String类型的事件。
4. 反注册Observer:
RxBus.get().unregister("addFeedTag", addOb);
注意:这里的Tag都为“addFeedTag”。
下面使用注解的方式更简单方便地使用RxBus(嗯-。-这里才是重点)。
首先来看下使用注解后的代码:
1. 注册Observer
这一步可以省略掉。
2. 发送一个事件(这里我们换一个事件:FeedItemCl3. ickEvent,我们定义这个事件是用来处理当Feed被点击后的事件)
RxBus.get().post(new FeedItemClickEvent().setPosition(position).setFeed(feed));
3. 接收事件,然后处理
1 @Accept2 public void onPostAccept(Object tag, FeedItemClickEvent event) {3 Logger.d(TAG, "onPostAccept event: " + event);4 Feed feed = event.getFeed();5 // 跳转到feed详情页面...6 }
如上,这里只需要编写一个方法,加上Accept注解,然后在方法中进行事件处理即可。
注意:方法名可以任意
方法参数一:必须为Object类型的tag;
方法参数二,如果这个方法只接收一种事件,则写明具体的事件类型,如上;如果这个方法接收多种事件,则类型需要为Object。
4. 反注册Observer
这一步也可以省略掉。
接收多种事件:
@Accept( acceptScheler = AcceptScheler.NEW_THREAD, value = { @AcceptType(tag = ActionEvent.CLOSE, clazz = String.class), @AcceptType(tag = ActionEvent.BACK, clazz = String.class), @AcceptType(tag = ActionEvent.EDIT, clazz = String.class), @AcceptType(tag = ActionEvent.REFRESH, clazz = String.class) } ) public void onPostAccept(Object tag, Object actionEvent) { Logger.d(TAG, "[ActionEvent]onPostAccept action event name: " + actionEvent); // todo: Accept event and process here (in new thread) }
这里@Accept注解中设置了acceptScheler为AcceptScheler.NEW_THREAD,指明方法运行在子线程中.
value中指明了接收的事件类型,这里表示这个方法接收4种类型的事件:CLOSE, BACK, EDIT, REFRESH.
注解解释:
@Accept注解
acceptScheler: 指定被注解的方法运行的Scheler。
value[]: AcceptType注解数组,用于指定接收事件的tag和class。
@AcceptType注解:
tag: 接收事件的tagclazz: 接收事件的类型
AcceptScheler:
详情见:rx.schelers.Schelers和rx.android.schelers.AndroidSchelers
如果设置的是AcceptScheler.EXECUTOR或AcceptScheler.HANDLER,则需要在Application中配置Executor和Handler:/** * Author: wangjie * Email: [email protected] * Date: 6/15/15. */public class MyApplication extends Application { private Executor acceptExecutor = Executors.newCachedThreadPool(); private Handler handler = new Handler(Looper.getMainLooper()); @Override public void onCreate() { super.onCreate(); RxBus.DEBUG = true; DefaultAcceptConfiguration.getInstance().registerAcceptConfiguration(new DefaultAcceptConfiguration.OnDefaultAcceptConfiguration() { @Override public Executor applyAcceptExecutor() { return acceptExecutor; } @Override public Handler applyAcceptHandler() { return handler; } }); }}
3. android rxjava retrofit 怎么设置本地缓存
android:layout_width="142dp" android:layout_height="36dp" 修改imagebutton上面两个属性就可以了
4. android 引入rxjava会使apk增大多少
android 引入rxjava会使apk增大一点点,只是一个jar包而已,不会大于2M的,放心使用。
5. rxandroid 生命周期什么时候调用
Dagger2:依赖注入并不是什么新技术,但是使用在Android确实一个新的尝试。AndroidApp越来越被当成严肃的大型项目来构建,很多在以前大型服务器开发上使用的技术都被应用到了移动开发。Android开发分模块开发,使用Dagger来松耦合模块。特别值得一体的是,Dagger2现在由Google亲自接管。Dagger‡。MVP:因为Android并没有严格的业务和界面区分,项目一复杂,就很容易使代码陷入混乱。现在Android开发社区对MVP模式讨论越来越热,觉得MVP是非常适合AndroidAPP开发。MVPforAndroid:。RxAndroid:函数响应式编程(FunctionalReactiveProgramming)也不是新内容,RxAndroid把RxJava带到Android环境中。很多时候,编写Android程序,你也可以看成是数据的处理和流动,换一种思想编程,曾经看起来很棘手的问题,瞬间就很优雅的解决了:ReactiveX/RxAndroid。MVVM:这是因为开始官方支持DataBinding,把MVVM直接带到Android中。数据绑定在WindowsWPF和Web已经非常常见,它非常高效的开发效率,让你只关心你的数据和业务。这也对Android开发来说,无疑是一个非常重大的影响:androidUI设计MVVM设计模式讨论?。插件化:针对大型Android项目,很多App开始使用插件来分模块构建相对独立的功能。Hybrid:完全使用HTML5开发App,目前还不成熟。但是折中方案在很多情况下是非常适合的,典型的就是微信,大部分信息展示都是通过H5来完成,同时通过Hybird方式,把Web和Native打通,提供给网页访问本地资源的能力。
6. android mvp rx为什么要在presenter处理
RxAndroid可以简单高度概括为“异步”。
异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。Android 创造的 AsyncTask 和Handler ,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。
7. rxandroid和rxjava的区别
RxJava要比EventBus的应用更广泛,EventBus仅仅是作为一种消息的传递工具,但是RxJava里面几乎可以做任何事情。
如果是Android开发的话,可以使用RxAndroid,这是对RxJava的一个扩展,结合sqare公司的retrofit可以很轻松的完成网络的访问。
我们知道,在Android中异步操作一般使用AsycTask来完成,但是AsycTask有很多缺点,如不能方便的终止任务的执行等。
RxAndroid完全可以替代AsycTask来完成各种异步操作,而且还有BindActivity和BindFragment方法,你根本不需要考虑异步操作时的Activity和Fragment的生命周期问题,还有更加强大的的链式调用,可以使程序很简洁。
EventBus有个缺点就是凡是使用了EventBus的类都不能进行混淆了,否则Evnetbus就找不到OnEvent方法了。
以上,推荐使用RxAndroid。
8. android 用rxjava和retrofit时怎么解决返回数据类型不一致
1. 首先定义带泛型的返回结果,Retrofit API 的原生结果映射为这种形式:
class Result<T> {
String ResultMessage;
int ResultCode;
T Data;
}
2. 处理错误的方法和 @朱诗雄 前辈方法差不多,放到作为静态方法放到 RetroUtil 里,这里 ApiException 为自己定义的一个异常,放入错误码和错误信息(错误码不止一个):
static <T> Observable<T> flatResult(Result<T> result) {
return Observable.create(subscriber -> {
switch (result.ResultCode) {
case Constants.SUCCESS_CODE:
subscriber.onNext(result.Data);
break;
case Constants.ERROR_CODE:
subscriber.onError(new ApiException(result.ResultCode, result.ResultMessage);
break;
default:
// ...
}
subscriber.onCompleted();
}
});
}
3. 在 API 包装类对于上述 Result<T> 格式的返回结果,统一调用 flatMap(RetroUtil::flatResult) 后的 API。这样每个 API 的返回结果就是 Observable<Data> 的形式并且在 errorHandler 中统一处理错误了。
// 接口方法
Observable<Result<User>> getUserInfo();
// 包装后的方法
Observable<User> getUserInfo() {
return mApi.getUserInfo.flatMap(RetroUtil::flatResult);
}
// 调用时
apiWrapper.getUserInfo()
.subscrible(user -> {
// 处理正常逻辑
}, error -> {
// 处理错误逻辑和异常,这里封装时通常也会统一处理,
// 提供一个默认的 Action1<Throwable> 参数,弹出
// throwable 的 message 打印日志等
});
9. rxandroid和volley哪个好用
两个不一样的东西。rx是响应式编程,让代码更有条理性,针对复杂逻辑来说很好用。volley是谷歌官方出来的网络框架,针对大量的小数据请求应用。