【问题标题】:RxJava observeOn Main Thread in Android/HarmonyOSRxJava observeOn Android/HarmonyOS 中的主线程
【发布时间】:2022-07-27 15:11:31
【问题描述】:

我正在开发华为 HarmonyOS 应用程序,我正在尝试使用 RxJava 实现一个用于后台任务的基类。我的问题是不知道怎么在主线程上观察。

在常规 Android 上,我会使用 AndroidSchedulers.mainThread()

但是我可以在 HarmonyOS 上分别使用什么基本的 java 应用程序?

public abstract class BaseUseCase<I, O> {

    private final CompositeDisposable disposables;

    public BaseUseCase() {
        this.disposables = new CompositeDisposable();
    }

    /**
     * Builds an {@link Observable} which will be used when executing the current {@link BaseUseCase}.
     */
    public abstract Observable<O> observable(I input);


    /**
     * Executes the current use case.
     *
     * @param observer {@link DisposableObserver} which will be listening to the observable build
     * by {@link #observable(I)} ()} method.
     * @param input Parameters (Optional) used to build/execute this use case.
     */
    public void execute(DisposableObserver<O> observer, I input) {
        Preconditions.checkNotNull(observer);
        final Observable<O> observable = observable(input)
                .subscribeOn(Schedulers.io())
                .observeOn( ??? );                <- What here???
        addDisposable(observable.subscribeWith(observer));
    }


    /**
     * Dispose from current {@link CompositeDisposable}.
     */
    private void addDisposable(Disposable disposable) {
        Preconditions.checkNotNull(disposable);
        Preconditions.checkNotNull(disposables);
        disposables.add(disposable);
    }

【问题讨论】:

  • 我对HarmonyOS不熟悉。基于文档,它有一个 TaskDispatcher uiTaskDispatcher = getUITaskDispatcher();TaskDispatcher 有一个 asyncDispatch 方法。我想你可以在它上面实现一个java.util.concurrent.Executor 并将它交给Schedulers.from 而不会有太多麻烦。
  • 我可以确认要实现的功能是什么?会调用哪些接口?

标签: java android rx-java huawei-developers harmonyos


【解决方案1】:

感谢 akarnokd 的回答!似乎工作。

为了澄清,我将UiExecutor注入BaseUseCase并将其用作:

.observeOn(Schedulers.from(uiExecutor));

@Singleton
public class UiExecutor implements Executor {

    TaskDispatcher dispatcher;

    @Inject
    public UiExecutor(AbilityPackage abilityPackage) {
        this.dispatcher = abilityPackage.getUITaskDispatcher();
    }

    @Override
    public void execute(Runnable runnable) {
        dispatcher.asyncDispatch(runnable);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2018-06-28
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多