观察不工作



我开始学习Android的Rx,我会发现一个错误。这是我的代码:

在我的Subscriber中,我打印到日志电流线程名称:

Subscriber<Integer> integerSubscriber = new Subscriber<Integer>() {
        // ... onCompleted, onError
        @Override
        public void onNext(Integer s) {
            Log.e("RX", "threadName " + getCurrThreadName());
        }
};      

在这里,我想在背景中运行代码,并从Mainthread中的观察值中获取数据:

 ArrayList list = new ArrayList();
 list.add(...) // creating data list
 Observable.from(list)
     .map(TransformFunc.getTransformer())
     .subscribeOn(AndroidSchedulers.mainThread())
     .observeOn(Schedulers.from(executor))
     .subscribe(integerSubscriber);
...

其他代码: 静态字符串getCurrThreadName(){ return thread.currentThread()。getName(); }

static class TransformFunc implements Func1<String, Integer> {
    private static TransformFunc instance;
    static TransformFunc getTransformer() {
       ... // return instance
        @Override
        public Integer call(@NonNull String s) {
            ...
                TimeUnit.SECONDS.sleep(4);
                Log.e("RX", "threadName " + getCurrThreadName());
            ...
            return s.length();
        }
}

但是,当我在设备上运行此代码时,我会看到白屏5-10秒,并且在日志中看到:

12-02 16:34:39.374 26086-26086/com.shevart.fitnessnotes E/RX: threadName main
12-02 16:34:39.378 26086-26180/com.shevart.fitnessnotes E/RX: threadName pool-1-thread-2
12-02 16:34:43.375 26086-26086/com.shevart.fitnessnotes E/RX: threadName main
12-02 16:34:43.379 26086-26216/com.shevart.fitnessnotes E/RX: threadName pool-1-thread-3
12-02 16:34:47.376 26086-26086/com.shevart.fitnessnotes E/RX: threadName main
12-02 16:34:47.396 26086-26253/com.shevart.fitnessnotes E/RX: threadName pool-1-thread-4
12-02 16:34:51.376 26086-26086/com.shevart.fitnessnotes E/RX: threadName main
12-02 16:34:51.398 26086-26292/com.shevart.fitnessnotes E/RX: threadName pool-1-thread-5

为什么onNext() MAP

之前 call()拨打 CC_4

您要在主线程上观察,而不是另一个方式。

 .subscribeOn(Schedulers.from(executor))
 .observeOn(AndroidSchedulers.mainThread())

通过调用.subscribeOn(),您基本上告诉Observable在特定的Scheduler上进行工作。另一方面,您告诉Observable在该线程上向您发送所有通知。

因此,您需要交换订阅和观察调度程序。

.subscribeOn(Schedulers.from(executor))
.observeOn(AndroidSchedulers.mainThread())

最新更新