我正在使用RxJava的Observable.zip方法将两个API调用合并为一个结果。出于某种原因,尽管我取消订阅订阅,但我得到了内存泄漏。我不确定这是否是我的最终错误,或者我是否需要创建Observable。
protected void onCreate(Bundle bundle) {
...
subscription = Observable.zip(
api.getConfiguration(),
api.getSettings().map(r -> r.getData()),
new Func2<ConfigurationResponse, List<Datum>, Struct>() {
@Override
public Struct call(ConfigurationResponse config, List<Datum> data) {
return new Struct(data, config.getCopy(), config.getSettings());
}
}
)
.compose(Schedulers.applyApiSchedulers())
.subscribe(
struct -> {
configurationManager.set(struct.data, struct.copy, struct.settings);
startNextActivity();
},
error -> {
startNextActivity();
}
);
}
protected void onDestroy() {
if (!subscription.isUnsubscribed()) {
subscription.unsubscribe();
}
}
这是Leak Canary的踪迹。
任何帮助都将不胜感激。
答案 0 :(得分:0)
我怀疑泄漏来自subscription
本身,因为您似乎不断通过它引用Subscriber
。尝试在onDestroy
中清除该引用并再次检查泄漏。
答案 1 :(得分:0)
这可能是改造中的泄漏,似乎有类似的报道here。
请注意,如果改装泄漏订户,您可以限制影响,如果您的映射器功能不再引用您的活动实例。
在你的情况下Struct
可能是一个非静态实例类(因此有一个对活动实例的隐式引用),如果你设法使它静态而不引用活动,你可能会摆脱它这个非常泄密。