Ваш Observer
не будет блокировать в качестве операции можно сделать, прежде чем вы подписаться на Observer
(так, он просто будет испускать ваше значение)
Что касается кода (Java 8 стиль для простоты):
Observable.just(preferences.getBoolean("vibrate", false))
.subscribeOn(Schedulers.io())//observe on new thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(shouldVibrate) -> {
if (shouldVibrate) {
Toast.makeText(context,"i should vibrate now",Toast.SHORT).show();
}
});
вы можете извлечь вызов в качестве переменной preferences.getBoolean(C"vibrate", false)
:
Boolean vibrate = preferences.getBoolean("vibrate", false);
Observable.just(vibrate)
.subscribeOn(Schedulers.io())//observe on new thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(shouldVibrate) -> {
if (shouldVibrate) {
Toast.makeText(context,"i should vibrate now",Toast.SHORT).show();
}
});
как вы можете видеть, vibrate
будет вычислен до и после этого основной поток будет заблокирован.
Вы должны написать «ленивый» звонок к методу с использованием метода Observable.create
Observable.create(sub -> {
Boolean vibrate = preferences.getBoolean("vibrate", false);
sub.onNext(vibrate);
sub.onCompleted();
})
.subscribeOn(Schedulers.io())//observe on new thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(shouldVibrate) -> {
if (shouldVibrate) {
Toast.makeText(context,"i should vibrate now",Toast.SHORT).show();
}
});
С помощью этого кода, то Boolean vibrate = preferences.getBoolean("vibrate", false);
будет называться только тогда, когда вы подписаться на Observer
.
(относительно к вашему, если в вашем абоненте, вы можете изменить его с filter
)
Observable.create(sub -> {
Boolean vibrate = preferences.getBoolean("vibrate", false);
sub.onNext(vibrate);
sub.onCompleted();
})
.filter((value) -> value)
.subscribeOn(Schedulers.io())//observe on new thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(shouldVibrate) -> {
Toast.makeText(context,"i should vibrate now",Toast.SHORT).show();
});
Вы рассматриваете 'preferences.getBoolean' быть«файл ввод-вывод»здесь? –
Я думаю [эти] (http://stackoverflow.com/questions/23447077/android-rxjava-non-blocking?rq=1) [вопросы] (http://stackoverflow.com/questions/25853696/ui-blocking -occurs-in-android-несмотря-rxjava? lq = 1) может помочь? –
да его файл IO, так как он записывает на диск. Это на самом деле просто пример, который я делал. – j2emanue