gpt4 book ai didi

rx-java - 在 0.18 中,后台任务如何在调度程序上执行?

转载 作者:行者123 更新时间:2023-12-03 22:58:24 24 4
gpt4 key购买 nike

感觉我在这里遗漏了一些东西,但我曾经这样做过:

    Schedulers.io().schedule(new Action1<Scheduler.Inner>() {
@Override
public void call(Scheduler.Inner inner) {
doWhatever();
}
});

我似乎无法再简单地使用调度程序来运行后台任务,而无需管理取消订阅( https://github.com/Netflix/RxJava/wiki/Schedulerhttps://github.com/Netflix/RxJava/blob/master/rxjava-core/src/main/java/rx/Scheduler.java )。

0.18 是否有一种模式可以让我轻松地运行 doWhatever,而无需跟踪工作人员、取消订阅等?

好像你可以这样做:
final Worker worker = Schedulers.io().createWorker();
worker.schedule(new Action0() {
@Override
public void call() {
doWhatever();
worker.unsubscribe();
}
});

但这似乎需要做更多的工作(尤其是对于 android.mainThread 调度程序)。

我在这里错过了什么?

最佳答案

在 Observable 中使用调度程序

如果您使用 RxJava,我认为您应该让 Observables 处理调度程序。在我的代码中,我认为我不必创建自己的 worker 并对其进行管理。

将 Observable 与 Scheduler 一起使用并在两种线程类型之间切换的示例。

public void doSomething() {
Observable
.create(new Observable.OnSubscribe<Boolean>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
int sleepTime = (int) (Math.random() * 10000);

System.out.println("Running on: " + Thread.currentThread().getId() + " sleep: " + sleepTime);

try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
System.out.println("Error!!! " + Thread.currentThread().getId());
subscriber.onError(e);
return;
}

System.out.println("Done!!! " + Thread.currentThread().getId());
subscriber.onNext(true);
subscriber.onCompleted();
}
})
// this will schedule your work in a background io thread. In this example the "call" method above.
.subscribeOn(Schedulers.io())
// this will schedule your next/complete/error on the androids main thread.
.observeOn(AndroidSchedulers.mainThread())
// kick off the actual work.
.subscribe(new Subscriber<Boolean>() {
@Override
public void onCompleted() {
// runs in main thread.
}

@Override
public void onError(Throwable e) {
// runs in main thread.
}

@Override
public void onNext(Boolean result) {
// runs in main thread.
}
});
}

直接使用调度程序

但是,我确实理解可能存在需要您直接使用调度程序的情况。所以,如果你想直接使用Scheduler。我认为以下内容符合您的要求。

使用 runAction 创建调度程序实用程序。
public static void runAction(Action0 action, Scheduler scheduler) {
Scheduler.Worker worker = scheduler.createWorker();
worker.schedule(new Action0() {
@Override
public void call() {
action.call();
worker.unsubscribe();
}
});
}

然后要使用它,传递一个要执行的操作和要使用的调度程序。
SchedulerUtil.runAction(new Action0() {
@Override
public void call() {
int sleepTime = (int) (Math.random() * 10000);

System.out.println("Running on: " + Thread.currentThread().getId() + " sleep: " + sleepTime);
try {
Thread.sleep(sleepTime);
} catch (InterruptedException ignored) {
}

System.out.println("Done!!! " + Thread.currentThread().getId());
}
}, Schedulers.io());

关于rx-java - 在 0.18 中,后台任务如何在调度程序上执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23279995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com