gpt4 book ai didi

android - Schedulers.io 创建了数百个 RxCachedThreadSchedulers

转载 作者:太空宇宙 更新时间:2023-11-03 12:31:52 24 4
gpt4 key购买 nike

我在我的 android 应用程序中使用 RxJava,它多次遇到 OutOfMemoryError。我用设备管理器检查了一下,我刚刚注意到,我有超过 200 个线程,其中大部分处于等待状态,通常是 RxCachedThreadSchedulers。 OOMError 由于线程过多而引发。我还注意到,如果我按下一个按钮,它会调用一个服务并获取一个 token 并将其缓存,线程数会增加 5!

所以,我用谷歌搜索并发现,Schedulers.io 可以创建无限线程。当我用 Schedulers.computation 替换每个 Schedulers.io 时,问题就消失了,但这没有任何意义,因为我使用 Schedulers.io 就像它应该被使用一样。

那么我如何使用 Schedulers.io 并确保它不会创建太多线程?

更新

我这样取消订阅:

    final Scheduler.Worker worker = Schedulers.io().createWorker();
worker.schedule(new Action0() {
@Override
public void call() {
long last = lastServerCommunication.getMillis();
LongPreference pref = new LongPreference(mSharedPreferences, PREF_KEY_LAST_SERVER_COMMUNICATION);
pref.set(last);
worker.unsubscribe();
}
});

更新#2

我使用 Schedulers.io 的常规方式是例如:

public Observable<Scenario> load() {
return Observable
.create(new Observable.OnSubscribe<Scenario>() {
@Override
public void call(Subscriber<? super Scenario> subscriber) {
try {
Scenario scenario = mGson.fromJson(mSharedPreferences.getString("SCENARIO", null), Scenario.class);
subscriber.onNext(scenario);
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(new Throwable());
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}

和:

    mSomeSubscription = mSomeManager.readFromDatabase()
.subscribeOn(Schedulers.io())
.subscribe(new Observer<List<SomeEntry>>() {
@Override
public void onCompleted() { }

@Override
public void onError(Throwable e) {
// some logging
}

@Override
public void onNext(List<SomeEntry> Entries) {
// Some action
}
});

最佳答案

好的,我找到原因了。查看说明,更新 #2:

return Observable.create(new Observable.OnSubscribe<Something>() {
@Override
public void call(Subscriber<? super Something> subscriber) {
try {
// Some action
subscriber.onNext(scenario);
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(new Throwable());
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());

当您像这样创建冷的 Observable 序列时,您必须确保在订阅者上调用 onCompleted,请参见上面的 subscriber.onCompleted();。好吧,它在代码中的某些地方不存在,因此生成了 io 线程。

非常感谢 akarnokd 的帮助!

关于android - Schedulers.io 创建了数百个 RxCachedThreadSchedulers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31294431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com