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 ...