Android RxJava2 amb运算符抛出java.lang.InterruptedException
我正在与Rxjava2操作员合作。我已经为实验创建了两个可观察的对象 可观察1: 我正在创建一个随机延迟来返回字符串 安巴里: 如果我用这种方式在两个可观察的线程,它工作得很好。 为什么使用调度程序线程会导致异常?为什么手动使用线程不会导致任何异常?有什么区别 编辑: 日志:Android RxJava2 amb运算符抛出java.lang.InterruptedException,android,rx-java,rx-java2,Android,Rx Java,Rx Java2,我正在与Rxjava2操作员合作。我已经为实验创建了两个可观察的对象 可观察1: 我正在创建一个随机延迟来返回字符串 安巴里: 如果我用这种方式在两个可观察的线程,它工作得很好。 为什么使用调度程序线程会导致异常?为什么手动使用线程不会导致任何异常?有什么区别 编辑: 日志: W/System.err: java.lang.InterruptedException W/System.err: at java.lang.Thread.sleep(Native Metho
W/System.err: java.lang.InterruptedException
W/System.err: at java.lang.Thread.sleep(Native Method)
W/System.err: at java.lang.Thread.sleep(Thread.java:1031)
W/System.err: at java.lang.Thread.sleep(Thread.java:985)
W/System.err: at com.yousuf.shawon.rxandroidsamples.fragments.AmdExampleFragment$5$1.subscribe(AmdExampleFragment.java:306)
W/System.err: at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
W/System.err: at io.reactivex.Observable.subscribe(Observable.java:11442)
W/System.err: at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
W/System.err: at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:571)
W/System.err: at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
W/System.err: at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/System.err: at java.lang.Thread.run(Thread.java:818)
通过使用调度程序,备份线程池会记住哪个线程正在为休眠的方法提供服务,并可以在取消时中断该方法。对于启动的普通线程,该引用将丢失,并且您尚未将其连接到取消机制:
@凌驾
public void subscribeffinal observeItemer发射器引发异常{
线程t=新线程新可运行{
@凌驾
公开募捐{
长睡眠时间=getRandomNumber;
Log.iTAG,Oservable1:Sleep:+sleepTime+
线程:+Thread.currentThread.getName;
试一试{
线程。睡眠时间;
}捕捉中断异常e{
e、 打印跟踪;
Log.eTAG,例如getMessage;
}
emitter.onNext来自Observable1结果;
发射器。未完成;
}
};
t、 开始;
emitter.setcancelable->t.interrupt;
}
Observable<String> observable2 =
Observable.defer(new Callable<ObservableSource<? extends String>>() {
@Override
public ObservableSource<? extends String> call() throws Exception {
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(final ObservableEmitter<String> emitter) throws Exception {
long sleepTime = getRandomNumber();
Log.i(TAG, "Oservable2 : Sleep: " + sleepTime + " Thread: " + Thread.currentThread().getName());
Thread.sleep(sleepTime);
emitter.onNext("From Observable2 Result" );
emitter.onComplete();
}
})
.subscribeOn(Schedulers.newThread());
}
});
private long getRandomNumber() {
return (long) (Math.random() * 100);
}
Observable.ambArray(observable1, observable2)
.subscribeOn(Schedulers.io())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.i(TAG, "Result : " + s);
}
});
Observable<String> observable1 =
Observable.defer(new Callable<ObservableSource<? extends String>>() {
@Override
public ObservableSource<? extends String> call() throws Exception {
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(final ObservableEmitter<String> emitter) throws Exception {
new Thread(new Runnable() {
@Override
public void run() {
long sleepTime = getRandomNumber();
Log.i(TAG, "Oservable1 : Sleep: " + sleepTime + " Thread: " + Thread.currentThread().getName());
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
Log.e(TAG, e.getMessage());
}
emitter.onNext( "From Observable1 Result" );
emitter.onComplete();
}
}).start();
}
})
/* .subscribeOn(Schedulers.newThread() )*/;
}
});
W/System.err: java.lang.InterruptedException
W/System.err: at java.lang.Thread.sleep(Native Method)
W/System.err: at java.lang.Thread.sleep(Thread.java:1031)
W/System.err: at java.lang.Thread.sleep(Thread.java:985)
W/System.err: at com.yousuf.shawon.rxandroidsamples.fragments.AmdExampleFragment$5$1.subscribe(AmdExampleFragment.java:306)
W/System.err: at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
W/System.err: at io.reactivex.Observable.subscribe(Observable.java:11442)
W/System.err: at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
W/System.err: at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:571)
W/System.err: at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
W/System.err: at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/System.err: at java.lang.Thread.run(Thread.java:818)