private void getAccount(String accountName,String password) {
Log.i("ACCOUNT_", "any message"); //this is executed
Single.fromCallable(() -> {
String account = accountName;
Log.i("ACCOUNT_", account); //not executed
return account;
}).flatMap((accountName) ->{
return accountRepository.findAccount(accountName);
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((List<Account> accounts) -> {
Account accountModel = accounts.get(0);//not executed
Log.i("ACCOUNT_", accountModel.getName());//not executed
},throwable -> {
Log.i("ACCOUNT_", "BAD EROR");//not executed
});
}
我已经更新了注释当我调用getAcount()
方法时哪些部分没有执行的代码。可能是什么原因?
答案 0 :(得分:0)
我几乎可以肯定,这与AndroidSchedulers.mainThread()
上observe
上的Single
执行有关。
在执行代码之前,请确保该线程正在运行并且没有终止。
很遗憾,我手中没有Android环境,您的代码不完整。但是,作为演示,我使用标准Java的模拟方法重写了您的代码。看起来像这样:
package com.dpopov.rxjava.stackoverflow;
import io.reactivex.Single;
import io.reactivex.SingleObserver;
import io.reactivex.SingleSource;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import java.util.Collections;
import java.util.List;
import java.util.Set;
public class ObservableNotExecuting {
public static void main(String[] args) throws InterruptedException {
getAccount("accName", "accPass");
Thread.sleep(5000);
}
private static void getAccount(String accountName, String password) {
System.out.println("ACCOUNT_" + "any message"); // this is executed
Single.fromCallable(() -> {
String account = accountName;
System.out.println("ACCOUNT_" + account); // not executed
return account;
})
.flatMap((Function<String, SingleSource<?>>) ObservableNotExecuting::findAccount)
.subscribeOn(Schedulers.io())
// .observeOn(Schedulers.mainThread())
// .observeOn(Schedulers.mainThread())
.subscribe(
accounts -> {
// accountObject -> {
// Account accountModel = accounts.get(0); // not executed
// System.out.println("ACCOUNT_" + accounts.name); // not executed
final Account account = ((List<Account>) accounts).get(0);
System.out.println("account: " + account.name);
},
throwable -> {
System.out.println("ACCOUNT_" + "BAD ERROR"); // not executed
}
);
}
private static SingleSource<List<Account>> findAccount(final String accountName) {
return new Single<List<Account>>() {
@Override
protected void subscribeActual(final SingleObserver<? super List<Account>> observer) {
final Account account = new Account(accountName);
final List<Account> accountsList = Collections.singletonList(account);
observer.onSuccess(accountsList);
}
};
}
static class Account {
public final String name;
public Account(final String name) {
this.name = name;
}
}
}
您可以尝试在本地执行此操作。
要点是:如果删除Thread.sleep
中的#main
行,则仅将第一行写入输出,因为main
线程在返回#getAccount
之后,任何Observable
逻辑开始执行。
因此,请查看执行RxJava代码时Android UI线程的运行方式。