javaandroidrx-javahuawei-developersharmonyos

RxJava observeOn Main Thread in Android/HarmonyOS


I am developing Huawei HarmonyOS app, and I am trying to implement a base class for background tasks with RxJava. My problem is that I don't know how to observe on the main thread.

On regular Android I would use AndroidSchedulers.mainThread().

But what can I use on HarmonyOS, respectively basic java application?

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);
    }

Ps. I used architecture concept by Fernando Cejas https://fernandocejas.com/blog/engineering/2014-09-03-architecting-android-the-clean-way/


Solution

  • Thanks akarnokd for the answer! Seems working.

    For clarification, I inject UiExecutor in BaseUseCase and use it as:

    .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);
        }
    }