#java #android #rx-java #rx-android
#java #Android #rx-java #rx-android
Вопрос:
Я в замешательстве. Я не нашел никаких статей об этом. Проверьте мой пример, в этом случае longOperation будет работать на Schedulers.io ()
private Completable longOperation() throws InterruptedException {
Thread.sleep(5000);
return Completable.complete();
}
private void doSomething() throws InterruptedException {
CompositeDisposable compositeDisposable = new CompositeDisposable();
compositeDisposable.add(Completable.defer(() -> longOperation())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableCompletableObserver() {
@Override
public void onComplete() {
customToast("long operation done");
}
@Override
public void onError(Throwable e) {
}
}));
}
но если я удалю Completable.defer(() -> longOperation()
private void doSomething() throws InterruptedException {
CompositeDisposable compositeDisposable = new CompositeDisposable();
compositeDisposable.add(longOperation()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableCompletableObserver() {
@Override
public void onComplete() {
customToast("long operation done");
}
@Override
public void onError(Throwable e) {
}
}));
}
Я не знаю, где.
В каком потоке будет работать мой метод ‘longOperation’?Я спрашиваю, потому что мой пользовательский интерфейс зависает после вызова doSomething без завершения.отложить.
Комментарии:
1. Во втором фрагменте »
longOperation
» будет работать в том же потоке, который вызываетdoSomething()
. Это действительно может быть поток пользовательского интерфейса, невозможно узнать, просто взглянув на эти фрагменты. Дело в том, что у вас естьThread.sleep
внутри »longOperation
«, так что этот метод завершится только тогда, когда caret достигнет первогоreturn
оператора, что в вашем случае происходит через 5 секундx<1
миллисекунд с момента вызоваdoSomething()
.2. вы имеете в виду 1-й фрагмент? потому что во втором
longOperation
не работал с пользовательским интерфейсом 🙂3. Нет, я имею в виду второй фрагмент. И я не говорил, что это работает в пользовательском интерфейсе — я сказал, что это будет работать в любом потоке, который вызывает,
doSomething()
который может быть, а может и не быть потоком пользовательского интерфейса.4. У меня проблема с
longOperation
, а не сdoSomething
🙂5. Вы спросили «какой поток
longOperation
выполняется во втором фрагменте». Мой ответ: «независимо от того, в каком потоке был вызванdoSomething()
метод». Есть ли у вас проблемы сdoSomething
или нет, этот факт не изменится.