用RxJava替代EventBus

在Android社区,每个人都在讨论RxJava,以及为什么我们应该在Android项目中使用RxJava。当我们开始在Android项目中实现RxJava后,我们注意到,我们的项目不需要引入Otto(或任何其他事件总线库)。通过这篇博客,我将展示我们是如何在项目中用RxJava替代Otto的。

我们项目中的MVP模式是怎么实现的

开始开发我们的无线流媒体应用Radyoland的时候,我们决定使用MVP模式来设计我们的代码底层,项目架构等。我们已经分成了几层(domain,model,app等)

在model层,我们有基于RESTful的类和接口。在domain层,我们试图实现应用程序的业务逻辑,所以我们写了一些用例类。

为什么我们当初使用event bus?

如果你的Android应用超过一层,这就意味着你需要在这些层之间传输数据。就我们而言,我们认为,如果我们为数据总线和UI总线定义一个BusUtil类,我们就可以轻松地在这些层(model,domain,presentation)之间传输数据。

你可以“订阅” ,并从总线发布的特定事件“取消订阅” 。这种方法背后的逻辑是这样运作的。

在我们的UsecaseController,PresenterImp类中,我们发出一个事件,请求REST实现类中描述的数据并且订阅此事件。

@Override
public void getRadioList() {
    Call<RadioWrapper> radioWrapperCall = restInterface.getRadioList();
    radioWrapperCall.enqueue(new Callback<RadioWrapper>() {
        @Override
        public void onResponse(Response<RadioWrapper> response, Retrofit retrofit) {
            dataBus.post(response.body());
        }

        @Override
        public void onFailure(Throwable t) {
            Timber.e(t.getMessage());
        }
    });
}

当我们调用了带有回调参数的异步数据请求方法,我们用总线发布结果数据,并订阅该事件。

@Subscribe
@Override
public void onRadioListLoaded(RadioWrapper radioWrapper) {
    new SaveDatabase(radioWrapper, databaseSource).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    uiBus.post(radioWrapper);
}

然后发布数据以更新UI 。activity或fragment应该在onResume()中订阅事件并在onPause()中解除订阅 。

@Subscribe
@Override
public void onRadioListLoaded(RadioWrapper radioWrapper) {
    radioListView.onListLoaded(radioWrapper);
    radioListView.dismissLoading();
}

这种实现方法效果还不错。但由于我们是优秀的Android程序猿,总是追求更好的解决方案。我们找到了一个方案,可以摆脱所有的回调和订阅方法。我们决定在代码中使用RxJava和RxAndroid。

let me tell you how we implemented Rxjava

我们是怎么实现Rxjava的

首先,我们需要改变所有RestInterface的返回类型 。

在没有RxJava的情况下 ;

@GET("")
Call<RadioWrapper> getRadioList();

有了Rxjava

@GET("")
Observable<RadioWrapper> getRadioList();

在REST实现类中,我们有API调用方法。我分享了其中的一个。使用RxJava启动后,我们需要改变这种方法的实现。我们把方法的返回类型改成Observable。经过了必要的改变后,方法看起来像这样。

@RxLogObservable
@Override
public Observable<RadioWrapper> getRadioList() {
    return restInterface.getRadioList();
}

我们完成了REST实现类。在此之后,我们需要改变用例的实现类和方法。

@Override
public Observable<RadioWrapper> getRadioList() {

    /**
     * Get radiolist observable from Cache
     */
    Observable<RadioWrapper> radioListDB =  databaseSource.getRadioList()
            .filter(radioWrapper -> radioWrapper.radioList.size() > 0)
            .subscribeOn(Schedulers.computation());

    /**
     * Load radiolist from api layer and save it to DB.
     */
    Observable<RadioWrapper> radioListApi = apiSource.getRadioList()
            .doOnNext(radioWrapper -> {
                Observable.create(subscriber -> {
                    databaseSource.save(radioWrapper);
                    subscriber.onCompleted();
                }).subscribeOn(Schedulers.computation()).subscribe();
            })
            .subscribeOn(Schedulers.io());

    /**
     * concat db and api observables
     */
    return Observable
            .concat(radioListDB, radioListApi)
            .observeOn(AndroidSchedulers.mainThread());

}

现在,我们的方法getRadioList返回一个Observable stream到我们的UI。正如你所看到的,我们根本不
需要通过事件总线发送数据。你还可以过滤,合并,缓存,或根据你的需要操作这个数据流。

我们学到了什么

虽然RxJava也不是那么好用,但是通过使用RxJava替换Otto,我们已经从代码中删除了许多冗余的回调代码块。在我看来,对于任何REST API的异步数据请求,RxJava都是最佳选择。
如果你有更好的解决方法,请随意在这里评论或分享例子。

Android中调试RxJava

原文链接 : Debugging RxJava on Android 调试是查找和分析bug的过程或者预防软件的正确操作出现问题Wikipedia。 当前调试不是一件容易的事情,我们在处理Android的异步操...

发布于:1年以前  |  541次阅读  |  详细内容 »

在Android开发中使用RxJava

ReactiveX是专注于异步工作的API,它将异步事件的处理与观察者模式、迭代器模式及函数式编程相结合了起来。实时地处理返回数据是在工程中经常出现的情景,所以使用高效、可...

发布于:1年以前  |  1121次阅读  |  详细内容 »

使用RxJava缓存Rest请求

原文链接 : Subscribe It While It&#039;s Hot: Cached Rest Requests With RxJava 免责声明: 在这篇文章中,我尝试去用正确的方法来解决一个常见的问题。我仍然正在整理我脑袋...

发布于:1年以前  |  1371次阅读  |  详细内容 »

RxJava开发精要5 - Observables变换

在上一章中,我们探索了RxJava通用过滤方法。我们学习了如何使用filter()方法过滤我们不需要的值,如何使用take()得到发射元素的子集,如何使用distinct()函数来去除重复的...

发布于:1年以前  |  823次阅读  |  详细内容 »

所属标签

最多阅读

简化Android的UI开发 4月以前  |  110214次阅读
Google Enjarify:可代替dex2jar的dex反编译 1年以前  |  1877次阅读
Android多渠道打包工具:apptools 1年以前  |  1693次阅读
Android权限 - 第一篇 1年以前  |  1640次阅读
Google Java编程风格规范(中文版) 1年以前  |  1605次阅读
Stetho 1年以前  |  1604次阅读
Android UI基本技术点 1年以前  |  1523次阅读
2015 Google IO带来的新 Android 开发工具 1年以前  |  1426次阅读
Gradle小知识#3:任务的顺序 1年以前  |  1405次阅读
MVP在Android平台上的应用 1年以前  |  1397次阅读
你应该知道的布局和属性 1年以前  |  1389次阅读
听FackBook工程师讲*Custom ViewGroups* 1年以前  |  1384次阅读
使用RxJava缓存Rest请求 1年以前  |  1371次阅读