Observable запускается в главном потоке, даже если метод subscribeOn () вызывается в другом потоке
У меня возникла странная проблема в одном из моих занятий. Когда возвращаюсь с фото / видео, в моемonActivityResult
Я показываю диалог, который позволяет пользователю назвать камеру. Как только пользователь нажимает ОК, я отправляюonNext()
субъекту с запрошенным именем файла, который копирует файл (и показывает диалог прогресса).
По какой-то причинеmap()
функция, которая делает копию всегда вызывается в главном потоке, хотя я вызываюsubscribeOn(Schedulers.io())
.
@Override
protected void onActivityResult(final int requestCode, int resultCode, Intent intent) {
...
final PublishSubject<String> subject = PublishSubject.create();`
mSubscription = subject
.subscribeOn(Schedulers.io())
.map(new Func1<String, String>() {
@Override
public String call(String fileName) {
Log.I.d(TAG,"map");
return doSomeIOHeavyFuncition();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(final String fullPath) {
Log.d(TAG,"onNext");
doSomethingOnUI(fullPath);
subject.onCompleted();
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
...
}
}, new Action0() {
@Override
public void call() {
...
}
});
final AlertDialog dialog = new AlertDialog.Builder
....
.create()
.show();
dialog.getButton(DialogInterface.BUTTON_POSITIVE)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String someString = getStringFromDialog(dialog);
dialog.dismiss();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
showProgressDialog();
subject.onNext(someString);
}
});
}
ИзменениеsubscribeOn(Schedulers.io())
позвонитьobserveOn(Schedulers.io())
решил проблему. Тем не менее, я хотел бы знать, почему это не сработало ...