android – 在“高流量”代码中使用RxJava时的对象分配?

android – 在“高流量”代码中使用RxJava时的对象分配?,第1张

概述我最近刚开始探索Rx Java并将其应用到我的项目的一小部分.事实证明,这部分很小,但有一个“高流量”:它被其他组件调用很多.一个例子是一个网络客户端,它被重复调用以获取远程数据,对响应应用一些转换,然后触发回调事件.我们只是说这些转换是轻量级的,所以我可以在主线程上做到: restService.getData() // retrofit interface that returns Obser 我最近刚开始探索Rx Java并将其应用到我的项目的一小部分.事实证明,这部分很小,但有一个“高流量”:它被其他组件调用很多.一个例子是一个网络客户端,它被重复调用以获取远程数据,对响应应用一些转换,然后触发回调事件.我们只是说这些转换是轻量级的,所以我可以在主线程上做到:

restService.getData() // retrofit interface that returns Observable<T>    .observeOn(AndroIDSchedulers.mainThread())    .map(data -> someMapPing(data))    .map(data -> someOtherMapPing(data))    .subscribe(this::fireResponseCallback,this::fireErrorCallback)

现在可以在没有RxJava的情况下完成同样的事情:

restService.getData() // retrofit interface that returns Call<T>    .enqueue(new Callback<T>() {        @OverrIDe        public voID onResponse(Call<T> call,Response<T> response) {            T data = response.body();            data = someMapPing(data);            data = someOtherMapPing(data);            fireResponseCallback(data);        }        @OverrIDe        public voID onFailure(Call<T> call,Throwable t) {            fireErrorCallback(t);        }    });

我在RxJava中观察到的是它在内存中创建了更多的对象.对于上面的示例,每个执行经历4个lambda表达式,每个表达式实现匿名类的1个实例化(Func1<>或Action1<>).如果没有RxJava,您只有1个匿名类实例化(Callback< T>).当多次触发相同的逻辑时,这种差异会迅速扩大.我想知道这是否是我在使用RxJava时应该注意的事情?如果是,那么保持对象数量小的良好做法是什么?

解决方法 是的,RxJava 1.x分配的对象多于理论上反应序列所需的对象(由于某些设计选择),但它不应该那么激烈.对于同步本地序列,它的分配率变得明显,但对于基于网络的序列很少.

如果你的Action和Func lambdas是纯粹的,你可以在成员字段中预先分配它们,并只在lambdas中重用它们的引用.此外,如果restService.getData()可以多次使用,则可以将整个链保存到字段中,只需在需要时调用subscribe即可.

class DataAccess {    final RestService restService;    final Observable<T> call = restService.getData()        .observeOn(AndroIDSchedulers.mainThread())        .map(data -> someMapPing(data))        .map(data -> someOtherMapPing(data));    final Action1<T> consumer = this::fireResponseCallback;    final Action1<Throwable> errorHandler = this::fireErrorCallback;    DataAccess(RestService restService) {        this.restService = restService;    }    voID doDataAccess() {        call.subscribe(consumer,errorHandler);    }}
总结

以上是内存溢出为你收集整理的android – 在“高流量”代码中使用RxJava时的对象分配?全部内容,希望文章能够帮你解决android – 在“高流量”代码中使用RxJava时的对象分配?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1128117.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存