- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在我的 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/
我在我的 android 应用程序中使用 RxJava,它多次遇到 OutOfMemoryError。我用设备管理器检查了一下,我刚刚注意到,我有超过 200 个线程,其中大部分处于等待状态,通常是
我有以下 RxJava 2 代码(在 Kotlin 中),其中有一个 Observable disposable = Observable.create({ subscriber ->
我是新来的。我正在尝试使用适用于 Android 的 RxJava 库,但出现错误。逻辑是处理按钮上的点击事件,然后映射它以从 EditText 获取值。 , 然后 flatmap它到Single通过
我是一名优秀的程序员,十分优秀!