Я использую RxJava в своем приложении для Android, и он несколько раз сталкивался с OutOfMemoryError. Я проверил это с помощью диспетчера устройств и только что заметил, что у меня более 200 потоков, большинство из которых находятся в состоянии ожидания, и обычно это RxCachedThreadSchedulers. Ошибка OOMError возникает из-за слишком большого количества потоков. Я также заметил, что если я нажимаю кнопку, которая вызывает службу, получаю токен и кэширую его, количество потоков увеличивается на 5!
Итак, я погуглил и обнаружил, что Schedulers.io может создавать неограниченное количество потоков. Когда я заменяю каждый Schedulers.io на Schedulers.computation, проблема исчезает, но это не имеет смысла, поскольку я использую 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
}
});