Android RxJava2 amb运算符抛出java.lang.InterruptedException

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

我正在与Rxjava2操作员合作。我已经为实验创建了两个可观察的对象

可观察1:

我正在创建一个随机延迟来返回字符串

安巴里:

如果我用这种方式在两个可观察的线程,它工作得很好。 为什么使用调度程序线程会导致异常?为什么手动使用线程不会导致任何异常?有什么区别

编辑:

日志:

     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)