Java Observable.create()订阅和observeOn不工作

Java Observable.create()订阅和observeOn不工作,java,android,multithreading,rx-java2,Java,Android,Multithreading,Rx Java2,在我的Android应用程序中,我使用了Rxjava2,但出现了一些奇怪的情况 在myDispossible中,我打印以记录当前线程名称: //1 Observable .create((ObservableOnSubscribe<UserModel>) e -> { //mock io if (phoneNumber.equals("HolyHigh") &&

在我的Android应用程序中,我使用了Rxjava2,但出现了一些奇怪的情况

在my
Dispossible
中,我打印以记录当前线程名称:

    //1
    Observable
            .create((ObservableOnSubscribe<UserModel>) e -> {
                //mock io
                if (phoneNumber.equals("HolyHigh") && password.equals("111111")) {
                    e.onNext(new UserModel());
                    e.onComplete();
                } else {
                    e.onError(new RuntimeException("Error."));
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .delay(1, TimeUnit.SECONDS)
            .subscribe(
                    r -> {
                        view.onLoginSuccess(new UserModel());
                        //test
                        String name = Thread.currentThread().getName();
                        Log.e("Thread Name", " Success Current Thread Name: " + name);
                    }
                    , e -> {
                        e.printStackTrace();
                        view.onLoginFailed(e.getMessage());
                        //test
                        String name = Thread.currentThread().getName();
                        Log.e("Thread Name", " Error Current Thread Name: " + name);
                    }
            );
并记录了以下内容:

单线程名称:单线程名称:main

我的错误在哪里?..

delay()
操作符默认在计算调度程序上操作,因此它被更改为在计算线程上获取通知的上游事件

您只需在订阅之前更改它,只需将
observeOn.observeOn(AndroidSchedulers.mainThread())
移动到
delay()
操作符之后


顺便说一句,
delay()
还有一个重载,它获取
Scheduler
参数,允许您更改默认的
调度器

对!!解释得很清楚。我移动了
observeOn(AndroidSchedulers.mainThread())
delay()之后,它工作了!多谢各位~
//2
    Single.timer(1, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(r -> {
                Log.e("Single Thread Name", "Single Thread Name: " + Thread.currentThread().getName());
                CommonUtil.showToast(r + "~");
            });