rxjava如何创建线程并将文本返回到ui

gg58donl  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(349)

我想运行一个新的线程,当用户点击按钮。在这个线程中,我在“i++”之后调用sleep(2000),并在textview中返回string(“text”+i)。我举了个例子,但不起作用:

Observable.create(new Observable.OnSubscribe<Void>() {
    @Override
    public void call(Subscriber<? super Void> subscriber) {
        SystemClock.sleep(2000); 
        i++;

        subscriber.onNext(null);

        subscriber.onCompleted(); 
    }
})
        .subscribeOn(Schedulers.computation()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new Action1<Void>() { 
            @Override
            public void call(Void aVoid) {
                // code like text.setText("text" + i)
            }
        });
w41d8nur

w41d8nur1#

您使用rxjava1还是rxjava2/3?
是否要在订阅上创建新线程?如果是的话,你什么时候用 Schedulers.newThread() 而不是 .subscribeOn(Schedulers.computation()) 在rxjava2/3中,不允许发出null subscriber.onNext(null); . 这实际上是你的问题。你想发射i++而不是 null .
我宁愿这样做:

AtomicInteger i = new AtomicInteger(0);

      Single.fromCallable(() -> {
        Thread.sleep(1000);

        return i.incrementAndGet();
      }).subscribeOn(Schedulers.computation())
        .observeOn(....)
        .subscribe(v -> ...)

不建议在没有任何同步的情况下改变不同线程的状态,因此请使用atomicinteger。

相关问题