Observável é executado no encadeamento principal, embora subscribeOn () seja chamado em outro encadeamento

Eu tive um problema estranho em uma das minhas atividades. Ao voltar de tirar uma foto / vídeo, no meuonActivityResult Estou mostrando uma caixa de diálogo que permite ao usuário nomear a câmera. Depois que o usuário pressionar OK, eu envioonNext() para um assunto com o nome de arquivo solicitado que copia o arquivo (e mostra a caixa de diálogo de progresso).

Por alguma razão, omap() A função que faz a cópia é sempre chamada no thread principal, mesmo que eu chamesubscribeOn(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);
                }
            });
}

Alterando asubscribeOn(Schedulers.io()) ligar paraobserveOn(Schedulers.io()) resolveu o problema. Ainda assim, gostaria de saber por que não funcionou ...

questionAnswers(1)

yourAnswerToTheQuestion