
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时的对象分配?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)